作用域链
每个函数都会形成一个自己词法空间我们也叫做
作用域
,外部的环境无法读取函数内部定义的内容;但是被定义在函数内部的函数可以读取到外层函数作用域下的内容。
每个作用域都是作用域链上的一个元素,最内层函数就是的作用域链的起始端具有最高的优先级
,外层函数是作用 域链的下一个元素节,就这样一直延伸window作用域。
例子
function outside() {
const name1 = "one";
// console.log(name2); //报错
function inside() {
const name2 = "two";
console.log(name1); // one
}
inside();
}
outside();
以上代码的作用域链顺序为 inside,outside,window;
函数作用域链中的命名冲突
产生条件
闭包
[注释1]情况下,作用域链的前端和作用域链的后一个元素中定义的变量相同就会产生变量冲突
优先级高低
越靠近作用域的优先级就越高。
例子
function outside() {
var x = 5; // 是outSide函数作用域下的变量
console.log(x); //5 var
function inside(x) { // x是inside函数作用域下的变量
return x * 2;
}
return inside;
}
//
const res = outside()(10);
console.log(res);// 20
- 以上代码的作用域链的顺序是什么?
用域链顺序inside,outside, window
- x为什么是10呢?
inside作用域下定义了x和下一个outside作用域中定义的变量名相同,此时就产生了变量名冲突。变量冲突的时候始终采用就近原则。因此会用inside的形参而不是outside作用域下定义的x
注释
- 注释1
所谓的闭包,一个函数和外层函数作用域中定义的变量捆绑一起,什么捆绑呢?作用域链的前端引用了作用域链后面的作用中的变量,导致作用域链后面作用域或者说函数调用栈无法被销毁。
此时我们可以理解为套间中的一个人拿了大门药匙导致套间外的人也无法打开门出去
以上是个人对作用域链的理解,有问题的地方欢迎各位好友在下方评论