Javascript 使用“访问全局属性”;这";函数中的关键字
我确实知道,在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
“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
您的棍子打错了。此
的值取决于函数的调用方式,而不是函数的定义方式
- 如果调用
则(在foo内部)window.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(调用方)中包含的函数代码的上下文
提供此参数,以及调用者提供的参数列表:
总结您的问题,您会问为什么在第一个代码片段中,
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();