是什么
作用域是指程序源代码中定义变量的区域。
作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。
怎么用
全局作用域
生命周期将存在于整个程序之内。
能被程序中任何函数或者方法访问。
在 JavaScript 内默认是可以被修改的。
容易被污染,能不用就别用。
函数作用域
函数内部作用域,其中变量,可以通过 return 获取。
var foo = function(n) {
var innerVariable = "ahhh"
return "hello" + String(n);
}
console.log(foo(" world")); // "helloworld"
console.log(innerVariable); //Uncaught ReferenceError: innerVariable is not defined
块级作用域
同类C语言,{}形成块作用域。如下
{
let var_a = 1;
var var_b = 2;
}
console.log(var_a); //Uncaught ReferenceError: var_a is not defined
console.log(var_b); //2
ECMAScript通过let const变量的声明方式,实现了块作用域。
词法作用域(静态作用域)
JavaScript采用静态作用域。
先看如下代码
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();
考虑bar()执行的打印结果。
如果JS是静态作用域,执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。
如果JS是动态作用域,执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。
做过实验克制,JS是采用静态作用域,即打印1。
结论:JavaScript是采用词法(静态)作用域。
动态作用域(Ref. this binding)
- 在 JavaScript 中的仅存的应用动态作用域的地方:this 引用。慎用this,待后续章节研究Javascript的this。
- 动态作用域,作用域是基于调用栈的,而不是代码中的作用域嵌套
补充
- 待补充模块:
- JavaScript->this(动态作用域), self
- Refs:
网友评论