作用域就是程序源代码定义变量的区域,规定如何去查找变量,作用域对变量的访问权。
在 js 中词法作用域规则:
1.函数允许访问函数外的数据.
2.整个代码结构中只有函数可以限定作用域.
3.作用规则首先使用提升规则分析
4.如果当前作用规则中有名字了, 就不考虑外面的名字
因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。
例子:
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar(); //1
浏览器执行bar函数,里面定义了局部变量value=2,但是没有操作,接着执行foo函数,console查找变量,如果没有就向上一级查找,也就是value=1,所以会打印1,bar函数内的局部变量没有被使用到,这个就是js的静态作用域(词法作用域)
再看一个例子《javascript权威指南》
var scope= "global scope";
function checkscope(){
var scope="local scope";
function f(){
return scope;
}
return f();
}
checkscope();
不论你在哪个return语句前console.log(scope)都会打印 local scope,原因也很简单,因为JavaScript采用的是词法作用域,函数的作用域基于函数创建的位置。
而引用《JavaScript权威指南》的回答就是:JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。
感谢