自由变量:在A作用域中使用变量X,却没有在A作用域中声明(在其他作用域中声明),对于A作用域来说X就是一个自由变量。
var x=10;
function fn(){
var b=20;
console.log(x+b);
}
以上代码b可以在fn作用域中取,因为就是在这里定义的。而x就得去另外一个作用域取。会觉得是父作用域。其实这样会有歧义。
var x=10;
function fn(){
console.log(x);
}
function show(f){
var x=20;
(function(){
f();//是10不是20
})()
}
show(fn);
要到创建这个函数的那个作用域中取值——是“创建”,而不是“调用”。
如果跨了一步,还没找到呢?——接着跨!——一直跨到全局作用域为止。要是在全局作用域中都没有找到,那就是真的没有了。
这个一步一步“跨”的路线,我们称之为——作用域链
以上代码中:第13行,fn()返回的是bar函数,赋值给x。执行x(),即执行bar函数代码。取b的值时,直接在fn作用域取出。取a的值时,试图在fn作用域取,但是取不到,只能转向创建fn的那个作用域中去查找,结果找到了。