Javascript 为什么可以';当引用外部环境时,我是否可以访问此特定变量?

Javascript 为什么可以';当引用外部环境时,我是否可以访问此特定变量?,javascript,this,lexical,Javascript,This,Lexical,我正在学习JS中的词汇范围和执行上下文,遇到了一个问题 我对关键字this的理解可能有限,但我发现它引用了任何函数当前执行上下文中的所有变量 考虑这个例子: function b(){ console.log(this); } var myVar = 1; b(); function a(){ function b(){ console.log(this); } var myVar = 2; b(); } var myVar = 100; a(); 在这里,

我正在学习JS中的词汇范围和执行上下文,遇到了一个问题

我对关键字
this
的理解可能有限,但我发现它引用了任何函数当前执行上下文中的所有变量

考虑这个例子:

function b(){
  console.log(this);
}
var myVar = 1;
b();
function a(){
   function b(){
     console.log(this);
   }
  var myVar = 2;
  b();
}
var myVar = 100;
a();
在这里,我将获得一个myVar的控制台日志,该日志将被分配给值1

现在来看这个例子:

function b(){
  console.log(this);
}
var myVar = 1;
b();
function a(){
   function b(){
     console.log(this);
   }
  var myVar = 2;
  b();
}
var myVar = 100;
a();
调用函数b时,我看到一个对myVar的引用,它被分配到100。为什么没有指定给2的myVar引用


“this”不是指当前函数的词法环境吗?在这种情况下,函数b包含在函数a中,而不是全局环境中

你对
的理解是完全错误的

的值取决于(通常)调用函数的方式。(详情请参见)

如果你是:

  • 在浏览器中
  • 你的JS没有运行(应该是这样)
  • 调用函数时没有显式上下文
…然后
将成为
窗口
对象


通常,当声明变量时,它只存在于声明它的范围内。它不是任何对象的属性

有一个例外:

当在全局范围内声明变量时(即,在任何函数之外或函数内部没有
let
var
),它也成为
窗口
对象的属性


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


b()没有上下文,因此
窗口
<代码>var myVar=100
不属于任何函数,因此是全局的,因此是
窗口的属性

您对
的理解是完全错误的

的值取决于(通常)调用函数的方式。(详情请参见)

如果你是:

  • 在浏览器中
  • 你的JS没有运行(应该是这样)
  • 调用函数时没有显式上下文
…然后
将成为
窗口
对象


通常,当声明变量时,它只存在于声明它的范围内。它不是任何对象的属性

有一个例外:

当在全局范围内声明变量时(即,在任何函数之外或函数内部没有
let
var
),它也成为
窗口
对象的属性


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


b()没有上下文,因此
窗口
<代码>var myVar=100
在任何函数之外,因此是全局的,因此是
窗口的属性

不是在函数a的上下文下吗?因此,函数b在函数a中作为对其外部环境的引用?@user3882106-No。正如我所说,上下文由函数的调用方式决定,而不是由函数的声明位置决定。看见不要混淆上下文和范围。b不是在函数a的上下文下吗?因此,函数b在函数a中作为对其外部环境的引用?@user3882106-No。正如我所说,上下文由函数的调用方式决定,而不是由函数的声明位置决定。看见不要混淆上下文和范围。