Javascript:与';这';

Javascript:与';这';,javascript,Javascript,这是一段代码 function test() { this.value = "foo"; } $(document).ready(function () { test(); alert(this.value); //--> return undefined alert(window.value); //--> return 'foo' }); 有人能给我解释一下这些结果吗 问候 Salvatore这个是一个复杂的关键词,让你头脑清

这是一段代码

function test() {
    this.value = "foo";       
}

$(document).ready(function () {
    test();
    alert(this.value);   //--> return undefined
    alert(window.value); //--> return 'foo'
});
有人能给我解释一下这些结果吗

问候


Salvatore

这个
是一个复杂的关键词,让你头脑清醒

我建议通读这篇文章,它可能会有更多帮助


Edit:我还认为您的
this.value
问题是由于作用域问题造成的。函数的作用域与jQuery
文档的作用域完全不同。ready(…)
一个。

Javascript的
根据函数调用方式的不同而工作


我不会亲自解释它,而是让你看这篇文章,它非常详细地介绍了它:

在你的函数
test()
中,这个
引用了
DOMWindow

$(document).ready()函数中,
指的是
文档

因此,由于在
test()
中设置了窗口的值,这就是为什么
window.value=>'foo'
,但
document.value=>未定义的原因


我不习惯jquery,但解决方案应该很简单:

 $(document).ready(...)
将用作参数的函数附加到文档对象的事件onReady。 函数的上下文应该是文档或事件(取决于您使用的框架)

我们可以从行开始分析onReady函数体

 alert(this.value);   //--> return undefined
返回undefined,因为由此指向的元素没有该属性

诀窍就在这条线上

test();
您可能认为测试函数体中的this关键字引用了外部函数的上下文,但javascript的作用域是lexycally,函数的上下文是 在声明函数时定义,而不是在调用函数时定义

你可以认为这个函数是一个全局函数,然后这个关键字就是这个函数本身(在javascript中,函数也是一个对象),那么测试是如何污染窗口对象的呢

alert(window.value); //--> return 'foo'
?

当您调用函数(不是方法或构造函数)或函数时,它的行为就像它是窗口对象的方法一样,然后在测试函数中定义窗口对象的值属性


完整的图片有点复杂,但这些是基本的

这是错误的,
这个
.ready()
范围指的是
文档
文档不是窗口的属性吗?非常感谢DanielB:-)只是为了好玩,试试这个:
窗口[“blarg”]=42;警报(blarg)
。这是因为所有“全局变量”实际上都是根对象(
window
)的属性。因此,您的第二个警报可能是
alert(value)
而不是
alert(window.value)
@Salvatore,请记住在选择时选择
接受的答案can@NaftaliakaNeal我对“$(document).ready()”引用“document”对象感到惊讶,在我看来,documentready的代码应该是:function ready(callback){callback()}但它绑定到“document”对象。这是选择器“$(document)”强制将“events callbacks”绑定到该对象吗?我不记得很多“jquery”,但我只是很好奇。请您将其中一个答案标记为正确吗?
alert(window.value); //--> return 'foo'