2016-09-28 40 views
1

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

回答

4

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

this的值取决于(通常)函数的调用方式。 (详情请见How does the “this” keyword work?)。

如果你是:

  • 你的JS是不是在strict mode运行(这应该是)
  • 调用函数时,没有明确的背景下
浏览器
  • ...然后this将是window对象。


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

    有一个例外:

    当一个变量在全局范围内声明(即外部的任何功能的或无letvar在函数内部),那么它也变为window对象的属性。


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

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

  • +0

    在函数a的上下文中是不是b?因此函数b作为函数a中的外部环境的参考? –

    +0

    @ user3882106 - 不会。正如我所说的,上下文是由函数的调用方式决定的,而不是声明的地方。请参阅http:// stackoverflow。com/questions/3127429/how-this-this-keyword-work。不要混淆上下文和范围。 – Quentin

    相关问题