作用域有两种模型,词法作用域(Lexical Scope)和动态作用域(Dynamic Scope),JavaScript 是词法作用域。
词法作用域也叫静态作用域:在定义变量和函数的时候就确定了访问权限,由变量和函数的位置来决策作用域,「JavaScript 变量生命周期在它声明时初始化」。
内部声明,外部不可用
function foo() {
var x = 1;
}
console.log(x);// x is not defined
foo()函数定义的 x ,只能在 foo() 内部使用,外部获取不到。
变量就近原则
var x = 1;
function foo() {
var x = 2;
console.log(x);
}
foo(); // 2
foo() 内部定义的 x 会屏蔽外部相同变量,一旦找到第一个匹配,那就不再继续向上查找。
向上查找
来源于《你不知道的 JavaScript 上》
JavaScript 引擎执行:
3、函数执行输出 a,b,c 三个值,bar 函数作用域里没有 a,b 的值,但有一个 c 的参数,此作用域查找结束,继续向上查找 a,b。
2、查找 bar 函数执行位置,去获取参数 c ,c 的参数是 b * 3 的值,在 foo 函数作用域中查找变量 b 。b 被定义过,它的值是 a * 2 , 在函数作用域查找 a ,a 是被传入的参数。此作用域查找结束。向上查找。
1、查找 foo 函数的执行位置,在外层 foo 函数传了一个值 2。
上面「执行过程」写的怪乱的,看图更容易理解。
JavaScript 的执行顺序是从上到下。
生命周期
局部变量在函数执行完毕后销毁,全局变量在页面关闭后销毁。
参考资料:
[1]https://github.com/mqyqingfeng/Blog/issues/3
[2]https://www.liaoxuefeng.com/wiki/1022910821149312/1023021187855808
原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34468.html