为什么在引用外部环境时不能访问这个特定的变量?
问题描述:
我正在学习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?
这不是指当前函数的词法环境吗?在这种情况下,函数b被包含在函数a中而不是全局环境中。
答
您对this
的理解是完全错误的。
this
的值取决于(通常)函数的调用方式。 (详情请见How does the “this” keyword work?)。
如果你是:
-
在
- 你的JS是不是在strict mode运行(这应该是)
- 调用函数时,没有明确的背景下
...然后this
将是window
对象。
通常,声明一个变量时,它只存在于它声明的范围内。它不是任何物体的财产。
有一个例外:
当一个变量在全局范围内声明(即外部的任何功能的或无let
或var
在函数内部),那么它也变为window
对象的属性。
你看到的效果是这两件事的结合。
b();
没有上下文,所以this
是window
。 var myVar = 100;
不属于任何函数,因此是window
的全局属性。
在函数a的上下文中是不是b?因此函数b作为函数a中的外部环境的参考? –
@ user3882106 - 不会。正如我所说的,上下文是由函数的调用方式决定的,而不是声明的地方。请参阅http:// stackoverflow。com/questions/3127429/how-this-this-keyword-work。不要混淆上下文和范围。 – Quentin