我正在学习 JS 中的词法范围和执行上下文,并遇到了一个问题。
我对关键字 this
的理解可能有限,但我看到它引用了任何函数当前执行上下文中的所有变量。
考虑这个例子:
function b(){
console.log(this);
}
var myVar = 1;
b();
在这里,我将获得一个控制台日志到 myVar,它将被分配给值 1。
现在这个例子:
function a(){
function b(){
console.log(this);
}
var myVar = 2;
b();
}
var myVar = 100;
a();
当函数 b 被调用时,我看到一个对 myVar 的引用,它被分配给 100。为什么没有对 myVar 的引用被分配给 2?
“this”不是指当前函数的词法环境吗?在这种情况下,函数 b 包含在函数 a 中,而不是全局环境。
最佳答案
你对this
的理解是完全错误的。
this
的值(通常)取决于函数的调用方式。 (有关详细信息,请参阅 How does the “this” keyword work?)。
如果你是:
- 在浏览器中
- 您的 JS 未在 strict mode 中运行(应该是)
- 函数在没有明确上下文的情况下被调用
... 然后 this
将成为 window
对象。
通常,当一个变量被声明时,它只存在于声明它的范围内。它不是任何对象的属性。
有一个异常(exception):
当一个变量在全局范围内声明时(即在任何函数之外或在函数内部没有 let
或 var
),那么它也成为 window
对象。
您看到的效果是这两者的结合。
b();
没有上下文,所以 this
是 window
。 var myVar = 100;
在任何函数之外,因此是全局的,因此是 window
的属性。
关于javascript - 为什么在引用其外部环境时我不能访问这个特定变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39752843/