Javascript 使用“访问全局属性”;这";函数中的关键字

Javascript 使用“访问全局属性”;这";函数中的关键字,javascript,this,Javascript,This,我确实知道,在javascript中,当您在函数中使用“this”关键字时,那么“this”将根据上下文引用该函数的“所有者”。因此,当我们有一个函数,并在其中使用“this”,那么“this”指的是全局(窗口)对象 我对“this”的工作原理有点困惑,例如在下面的代码中,“this”应该能够解析x,因为x几乎是全局对象的属性(在本例中为窗口)。但是在这种情况下,this.x会提醒“未定义”,而不是x值 var x = "Global"; function foo(){ alert(t

我确实知道,在javascript中,当您在函数中使用
“this”
关键字时,那么
“this”
将根据上下文引用该函数的“所有者”。因此,当我们有一个函数,并在其中使用
“this”
,那么
“this”
指的是全局(窗口)对象

我对
“this”
的工作原理有点困惑,例如在下面的代码中,
“this”
应该能够解析
x
,因为
x
几乎是全局对象的属性(在本例中为窗口)。但是在这种情况下,
this.x
会提醒
“未定义”
,而不是
x

var x = "Global";

function foo(){
    alert(this.x);   //undefined     
};
foo();
然后我也尝试了其他一些东西:

function bar(){
    function foo(){
        alert(this); //[Object DOMWindow]
    };
    foo();
};

bar();
如果我的理解是正确的,那么在第二种情况下,
'this'
应该引用
bar()
,因为它是
foo()
的所有者,但为什么它仍然引用全局对象呢

有人能解释一下关于“this”关键字的正确理论吗?

是的,
this
始终是正在执行的函数的所有者,关于这个主题的最佳答案是


至于
bar()
,它是一个独立的函数,
将绑定到上面链接的答案中所述的“全局”对象,您的情况是
DOMWindow
您的棍子打错了。
的值取决于函数的调用方式,而不是函数的定义方式

  • 如果调用
    window.foo()
    则(在foo内部)
    将是
    窗口
  • 如果调用
    bar.foo()
    ,则
    将是
    bar
    (尽管您需要复制
    foo
    ,因此它首先是
    bar
    的属性)
  • 如果调用
    baz.bar.foo()
    ,则
    将是
    bar
    (您只能通过
    获取父对象)
  • 如果您调用
    foo.call(bar)
    也将是
    bar
    ,因为
    调用
    允许您覆盖
  • 如果调用
    newfoo()
    ,则
    将是正在创建的新对象
默认对象是
window
,因此,如果只调用
foo()
,则这与
window.foo()
相同


函数定义在什么范围内并不重要。

如果您真的想了解
这个
是如何工作的,请阅读
10.3执行上下文
一节中的

以下是第10.4.3节中的内容:

10.4.3输入功能代码

当控件进入执行时,将执行以下步骤 函数对象F(调用方)中包含的函数代码的上下文 提供此参数,以及调用者提供的参数列表:

  • 如果函数代码是严格代码,请将ThisBinding设置为 thisArg

  • 否则,如果thisArg为null或未定义,请将ThisBinding设置为 全局对象

  • 否则,如果类型(thisArg)不是对象,请将ThisBinding设置为 ToObject(thisArg)

  • 否则将ThisBinding设置为thisArg

  • 让localEnv作为调用NewDeclarativeEnvironment的结果 将F的[[Scope]]内部属性的值作为 争论

  • 将LexicalEnvironment设置为localEnv

  • 将VariableEnvironment设置为localEnv

  • 设code为F的[[code]]内部属性的值

  • 使用函数代码执行声明绑定实例化 代码和参数列表如10.5所述


  • 总结您的问题,您会问为什么在第一个代码片段中,
    this.x
    未定义的

    var x = "Global";
    function foo(){
        alert(this.x);   //undefined     
    }
    foo();
    
    这根本没有意义,
    this
    值应该引用全局对象-如果您的代码处于严格模式,您将得到一个
    TypeError
    ,因为
    this
    本身将是
    未定义的

    我认为
    this.x
    可能是
    undefined
    的唯一方法是在函数中声明
    x


    检查以下两个示例:并且,这是完全相同的代码,区别在于第二个示例,代码包装在
    onload
    事件处理程序中,因此
    x
    变量在全局范围内不存在(
    window.x
    未定义的
    )…

    可能重复的也可能重复的,其中第一个答案可能是您想要的详细回答。@alex c:不太可能。请重新阅读问题:)@BennyTija,在您的第一个示例中,您如何调用
    foo
    ??如果您将其称为
    foo()并且您的代码不在严格模式下,
    应引用全局对象。。。另外,您确定您的代码是在任何函数之外执行的吗??如果您的代码以某种方式包装在一个函数中(例如事件处理程序),那么
    var x
    声明显然不会在全局范围内进行…@BennyTija,我看到了您的编辑,这没有意义,
    这个
    应该引用全局对象,我认为
    这个.x
    的唯一方式可能是
    未定义的
    ,正如我刚才所说,如果
    x
    的变量声明是在另一个函数中进行的。检查以下两个示例:并且,它是完全相同的代码,区别在于第二个,代码被包装在一个onload处理程序中,因此
    x
    变量在全局范围内不存在……我知道这一点。但是如何解释第一段代码呢?this是foo()的所有者,表示它是窗口。x属于全局对象,即窗口。但是为什么这个.x警报没有定义?“总是”是
    var x = "Global";
    function foo(){
        alert(this.x);   //undefined     
    }
    foo();