感谢讶羽大大的分享,想看原文移步讶羽大大的GitHub
静态作用域
JavaScript使用的是词法作用域,也就是静态作用域。
也有说使用了动态作用域的
例子:
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();//1 因为是JS采用的是静态作用域
记住一点:JavaScript的作用域是在定义的时候就确定了。
所以这个例子中,我们去找value,先在foo里找,没有,再按字面,从其作用域链向上,也就是foo()外面找,value = 1。
再来看看作用域链
此例子中有三个作用域。全局作用域以及下面两个平级的:foo和bar。所以当我们在foo找不到value的时候,就只能在全局去找,而不是在bar去找。
关于闭包
这个例子中bar()应该就不是一个闭包,为什么呢?
因为他里面的foo并没有引用bar作用域里的任何变量,所以保存不了任何东西,于是会被垃圾回收。
思考题
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
这就是一个闭包,试着分析一下即可。