JavaScript 函数的作用域在函数定义的时候就决定了
理解下面这句话,你就理解了词法作用域:
JavaScript 函数的作用域在函数定义的时候就决定了。
var name = 'mango';
function getName() {
return name;
}
function changeName() {
var name = 'apple';
return getName();
}
changeName();
这段代码会返回什么? 答案是'mango'。
JavaScript 函数的执行的作用域链是在函数定义的时候创建的。执行 getName() 时,其中的变量 name 在函数内部没有,就在其定义的地方往作用域链上层寻找变量name('mango'),那么不管何时何地执行函数 getName(),这种绑定在执行 getName() 时始终有效。
词法作用域与闭包
为了去实现这种词法作用域,JavaScript函数对象的内部状态不仅包含函数逻辑的代码,除此之外还包含当前作用域链的引用。函数对象可以通过这个作用域链相互关联起来,如此,函数体内部的变量都可以保存在函数的作用域内,称之为闭包。
思考
最后,让我们看一个《JavaScript权威指南》中的例子:
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()();
做个笔记,读冴羽大佬的博客有感。原文可点击。