我想解决
- 上下文
- 此上下文(与上下文的关系)
- 范围
1:执行上下文
JavaScript 是一种单线程语言,这意味着一次只能执行一个任务。当 JavaScript 解释器最初执行代码时,它首先进入一个默认的全局执行上下文。从此时起,每次调用函数都会创建一个新的执行上下文。
这是经常引起混淆的地方,执行上下文一词实际上是出于所有意图和目的,更多地指的是范围而不是上下文。这是一个不幸的命名约定,但它是 ECMAScript 规范定义的术语,所以我们有点坚持。
每次创建新的执行上下文时,它都会附加到执行堆栈的顶部。浏览器将始终执行位于执行堆栈顶部的当前执行上下文。一旦完成,它将从栈顶移除,控制权将返回到下面的执行上下文。
一个执行上下文可以分为创建和执行阶段。在创建阶段,解释器将首先创建一个变量对象(也称为激活对象),该对象由执行上下文中定义的所有变量、函数声明和参数组成。然后从那里初始化作用域链,最后确定 this 的值。然后在执行阶段,代码被解释执行。
2 : 这个上下文
什么是“这个”上下文?
上下文通常由函数的调用方式决定。当函数作为对象的方法被调用时,this 被设置为调用该方法的对象:
var obj = {
foo: function() {
return this;
}
};
obj.foo() === obj; // true
同样的原则也适用于使用 new 操作符调用函数来创建对象的实例。以这种方式调用时,函数范围内的 this 的值将被设置为新创建的实例:
function foo() {
alert(this);
}
foo() // window
new foo() // foo
当作为未绑定函数调用时,这将默认为浏览器中的全局上下文或窗口对象。但是,如果函数在严格模式下执行,上下文将默认为 undefined。
3 : 变量范围
变量可以在局部或全局范围中定义,这确定了变量在运行时从不同范围的可访问性。任何定义的全局变量,这意味着在函数体之外声明的任何变量都将在整个运行时存在,并且可以在任何范围内访问和更改。局部变量仅存在于定义它们的函数体内,并且对于该函数的每次调用都有不同的作用域。在那里,它只能在该调用内进行值分配、检索和操作,并且在该范围之外无法访问。
ECMAScript 6 (ES6/ES2015) 引入了支持块作用域局部变量声明的 let 和 const 关键字。这意味着变量将被限制在定义它的块的范围内,例如 if 语句或 for 循环,并且在块的开始和结束花括号之外无法访问。这与 var 声明相反,var 声明可以在定义它们的块之外访问。let 和 const 之间的区别在于 const 声明,顾名思义,是常量 - 对值的只读引用。这并不意味着值是不可变的,只是变量标识符不能被重新分配。
其他主题:
GC:GC
原型设计:Prototyping