美文网首页编程
《JavaScript高级程序设计》读书笔记-第七章(函数表达式

《JavaScript高级程序设计》读书笔记-第七章(函数表达式

作者: 极奏 | 来源:发表于2019-07-06 15:37 被阅读0次

函数

函数提升


  • 函数声明提升
    执行代码之前会先读取函数声明。意思是可以把函数声明放到调用它的语句后面
sayHi()
function sayHi(){
  *****
}
  • 函数表达式
var functionName = function(arg0, arg1, arg2){
  *****
}

这个就不能把函数放到调用它的语句后面了,会报错

  • 理解函数提升的关键,就是理解函数声明和函数表达式之间的区别。
//不要这么写
if (condition) {
  function sayHi(){
    console.log('Hi')
  }
}else {
  function sayHi(){
    console.log('Hello')
  }
}

这在ECMAScript上属于无效语法,JavaScript引擎会尝试修正错误,将其转换为合理的状态。大多数浏览器会返回第二个声明,忽略condition。Firefox会在condition为true时返回第一个声明。

可以这样做,用函数表达式:

let sayHi
if(condition){
  sayHi = function(){
    console.log('Hi')
  }
}else {
  sayHi = function(){
    console.log('Hello')
}

递归


js在递归里面可以使用arguments,callee来防止函数名被置空的情况,例如:

function factorial(num) {
  if(num <= 1){
    return 1
  } else {
    return num * factorial(num - 1)
  }
}

var anotherFactorial = factorial
factorial = null
console.log(anotherFactorial(4))

上面factorial函数被置空之后,程序就会报错:


我们可以这样解决

function factorial(num) {
  if (num <= 1){
    return 1
  } else {
    return num * arguments.callee(num - 1)
  }
}

又或者是这样
创建一个名为f()的命名函数表达式

var factorial = function f(num) {
  if(num <= 1){
    return 1
  }else {
    return num * f(num-1)
  }
}

闭包


闭包是指有权访问另一个函数作用域中的变量的函数。
如何创建作用域链以及作用域链有什么作用的细节,对彻底理解闭包至关重要。

  • 函数的调用过程:
    1、创建一个执行环境execution context及相应的作用域链
    2、把作用域链赋值给一个特殊的内部属性[Scope]
    3、用this、arguments和其他命名参数的值来初始化函数的活动对象(activation object)

例如

function compare(value1,value2){
  if(value1 < value2){
    return -1
  }else if(value1 > value2){
    return 1
  }else{
    return 0
  }
}
书上的图
一般作用域链包含两个变量对象:本地活动对象以及全局变量对象
闭包不同
未完待续

相关文章

  • js中的arguments对象

    《JavaScript高级程序设计》读书笔记 js中函数的参数与别的语言的参数有些不同。js中的函数不介意传递进来...

  • 执行环境和作用域

    《JavaScript高级程序设计》读书笔记 执行环境是js中最为重要的一个概念。执行环境定义了变量或函数有权访问...

  • Javascript 基础

    1、函数防抖和函数节流 【《javascript高级程序设计》里,函数节流是这里讲的函数防抖。】函数防抖: 在事件...

  • JavaScript高级程序设计读书笔记之闭包

    ps:如无说明,下文中的“书”特指JavaScript高级程序设计这本书。 闭包:JavaScript高级程序设计...

  • js红宝书笔记十一 第十章 函数 闭包

    本文继续对JavaScript高级程序设计第四版 第十章 函数 进行学习 一、创建函数 函数是ECMAScript...

  • 第3章: 基本概念

    2020-07-30学习JavaScript高级程序设计 笔录 语法 数据类型 流控制语句 函数 3.1.1: 函...

  • JavaScript参数传递

    《javascript高级程序设计》4.1.3:所有函数的参数都是按值传递的就是说把函数外部的值赋值给函数内部的参...

  • 函数表达式

    以下内容总结自《JS高级程序设计》第三版 什么是函数表达式? 函数表达式,是JS中定义函数的一种方式。在JS中,共...

  • JavaScript创建对象的高级方法

    创建对象的方法 读《JavaScript高级程序设计》所得。 工厂模式——》构造函数模式——》原型模式——》构造函...

  • 8.JavaScript深入之参数按值传递

    定义 在《JavaScript高级程序设计》第三版 4.1.3,讲到传递参数: ECMAScript中所有函数的参...

网友评论

    本文标题:《JavaScript高级程序设计》读书笔记-第七章(函数表达式

    本文链接:https://www.haomeiwen.com/subject/chqccctx.html