红皮书函数

  1. 定义函数
    定义函数方式:函数声明,函数表达式
    函数声明有函数声明提升,可把函数声明放在调用它的语句后面
    创建一个函数并将它赋值给一个变量,这种情况下创建的函数叫做匿名函数,该函数表达式在使用前必须先赋值

  2. 闭包
    有权访问另一个函数作用域中的变量的函数,常见创建方式,就是在一个函数内部创建另一个函数

    内部函数的作用域链中包含外部函数的作用域,当函数被调用时,会创建一个执行环境及相应的作用域链。

    每个执行环境都有一个表示变量的对象:变量对象,局部环境的变量对象,只在函数执行的过程中存在。

    1. 在创建函数时,会创建一个预先包含外部环境的变量对象的作用域链,该 作用域链被保存在内部的[[Scope]]属性中,作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象。

    2. 调用函数时,会为函数创建一个执行环境,然后复制函数的[[Scope]]属性中的对象构建起执行环境的作用域链,创建该函数的活动对象并推入执行环境作用域链的前端,则其作用域链中包含的变量对象:本地活动对象和复制而来的活动对象

    function compare(value1, value2) {
      if (value1 < value2) {
        return -1
      } else if (value1 > value2) {
        return 1
      } else {
        return 0
      }
    }
    var result = compare(5, 10);
    

    红皮书函数

    function fun1(name) {
      return function () {
        console.log(name)
      }
    }
    var re = fun1('wang')
    re()
    //解除对匿名函数的引用(以便释放内存)
    re = null
    

    fun1执行完毕以后,其作用域链被销毁,但是其内部匿名函数的作用域链还引用着fun1的活动对象,所以fun1的活动对象不会被销毁,匿名函数被销毁后,fun1活动对象才会被销毁

    匿名函数的执行环境具有全局性,其 this 对象通常指向 window;
    this 和 arguments,内部函数在搜索这两个变量时,只会搜索到其自己的活动对象为止,而自己的活动对象里没有定义this,所有指向全局的window

  3. 利用闭包创建私有作用域

    (function(){
       var date=new date()
     })()
    

    在该函数中定义的任何变量,都会在函数立即执行结束时被销毁,这样限制向全局作用域中添加过多的变量和函数,来减少命名冲突

上一篇:DataFrame 求存在空值的行或列


下一篇:如何处理 ‘numpy.generic‘ 对象的 ‘属性 ‘dtype‘ 错误?