1. 函数作为值的引用:把函数赋值给变量,通过访问变量获取对函数的调用
let add = function (x, y) {
return x + y;
}
add(2, 3);
2. 除了把函数赋值给变量,也可以把函数赋给对象属性,形成方法
3. 函数是一类特殊对象,可以拥有属性,当需要给函数设定一些静态信息时,把其设为属性会比较方便
function add (x, y) {return x + y;}
add.version = "v0.0.1";
4. 闭包:JavaScript 采用的是词法作用域,函数的执行依赖与变量作用域,这个变量作用域在函数定义时决定,而不是函数调用时决定。为了实现这种特性,函数对象内部状态不仅仅包括代码逻辑还包括引用当前的作用域链。函数对象可以通过作用域链进行关联,函数的变量都可以保存在函数作用域中,这种特性就称为闭包;
a.理解闭包首先需要理解词法作用域:
var info = "23";
function show () {
var info = "34";
function edit() { return info;}
return edit();
}
show(); => 34
作用域链是一个对象列表,每次调用函数都会创建一个新的对象来保存局部变量,把这个对象加到作用域链中,当函数返回时,就将这个绑定变量的对象删除。如果不存在嵌套函数,也没有其他引用指向这个绑定变量的对象,那么这个绑定变量的对象就会被当做垃圾回收。如果存在嵌套函数,每个嵌套函数都会有个作用域链,并且这些作用域链指向一个变量绑定对象,如果这些嵌套函数在外部函数中保存下来,那么它们也会和绑定对象一样当作垃圾回收。如果这些嵌套函数又定义了嵌套函数并将其返回或者存储在某些属性中,这时就会有个外部引用指向这个嵌套函数,它就不会被当作垃圾回收。(闭包就是函数调用时内部嵌套函数可以引用函数变量,表现就是内部函数调用到外部变量。实现的原因是函数内部的嵌套函数是指向同一作用域链,在作用域链上保存了由相关变量构成的链条,已知的有四种作用域链:Block、Script、Global、Closure)