function main() {
var name = 'xiaoming';
return function () {
console.log(name);
}
}
var output = main();
output();
main()函数执行会返回一个函数,并赋值给了output。这说明output的定义时再main()外部,但为啥我在main()外部执行output()却可以使用name并正常输出name的值呢?
在javascript中,函数的变量作用域是通过作用域链定义的,它在函数定义之初就已经创建完毕,而非调用函数时才决定。
闭包的特性就是——当函数里面定义了一个嵌套的函数,并将这个嵌套的函数作为返回值“返回或储存”在某处属性里时,就会有一个外部引用指向这个嵌套的函数,并同时将他的作用域链保存下来——而这条作用域链就包含了嵌套函数的局部变量以及定义它们的外部函数的局部变量
在示例代码中,执行main()并将嵌套函数返回给output时,output()生成的变量作用域里,就包含了main()里的name及值。所以,可以正常输出name的值。
闭包的特点就是能把原始作用域的内容带出去(事实上是同作用域下的变量可以访问
如果某个作用域下只要还有一个变量(包括函数变量)在使用,那么这个作用域下的其他变量都不会被销毁,而是保存起来,避开内存销毁机制。
网友评论