理解Javascript闭包
看如下代码:
1 function foo() { 2 var a = 1; 3 function bar() { 4 console.log(a) 5 } 6 return bar 7 } 8 var baz = foo() 9 baz()
打印结果显示为1,
在 foo() 执行后, 其返回值(也就是内部的 bar() 函数) 赋值给变量 baz 并调用 baz(), 实际上只是通过不同的标识符引用调用了内部的函数 bar()。
此时,foo()执行后通常以为引擎的垃圾回收机制销毁foo的内部作用域,实际上受bar所声明位置的影响,使得此作用域一直存在,bar对此作用域的
引用就叫作闭包。
1 var fn; 2 function foo() { 3 var a = 2; 4 function bar() { 5 console.log(a) 6 } 7 fn = bar 8 } 9 function baz() { 10 fn() 11 } 12 foo() 13 baz()
将内部函数传递到所在词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处使用这个函数,都会使用闭包。