javascript - 为什么在引用其外部环境时我不能访问这个特定变量?

标签 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?

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

最佳答案

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

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

如果你是:

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

... 然后 this 将成为 window 对象。


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

有一个异常(exception):

当一个变量在全局范围内声明时(即在任何函数之外或在函数内部没有 letvar),那么它也成为 window 对象。


您看到的效果是这两者的结合。

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

关于javascript - 为什么在引用其外部环境时我不能访问这个特定变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39752843/

相关文章:

javascript - 单击选择后,cordova Windows8.1 上的 console.log/info/assert undefined

javascript - Grunt 插件不会覆盖任务级别选项

javascript - 如何以编程方式在 Cognito 用户池中创建用户?

javascript - 为什么 'find' 查询在 MongoDB 中返回一个 Query 对象?

c++ - 不能通过这个因为错误的类类型转换

Haskell:字符 'i' 处的字符串/字 rune 字中的词法错误

Javascript 在分配给其他变量时丢失了上下文

java - 在 Java : 中迭代 "this"

javascript - 是否有一个 JavaScript 等价于 Python pass 语句,它什么都不做?

algorithm - 语法高亮/词法分析算法