为什么在引用其外部环境时无法访问此特定变量?

时间:2016-09-28 16:21:58

标签: javascript this lexical

我在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而不是全局环境中。

1 个答案:

答案 0 :(得分:4)

您对this的理解是完全错误的。

this的值(通常)取决于函数的调用方式。 (有关详细信息,请参阅How does the “this” keyword work?。)

如果你是:

  • 在浏览器中
  • 你的JS没有在strict mode(应该是)
  • 中运行
  • 调用该函数时没有明确的上下文

...然后this将是window对象。

通常,当声明变量时,它仅存在于声明它的范围内。它不是任何物体的财产。

有一个例外:

当变量在全局范围内声明时(即在任何函数之外或在函数内没有letvar),它也会成为window对象的属性。

你看到的效果是这两件事的结合。

b();没有上下文,因此thiswindowvar myVar = 100;不在任何函数之内,因此是window的全局属性。