这是一段代码
function test() {
this.value = "foo";
}
$(document).ready(function () {
test();
alert(this.value); //--> return undefined
alert(window.value); //--> return 'foo'
});
有人能解释一下这些结果吗?
此致
的Salvatore
答案 0 :(得分:6)
在您的函数test()
中,this
正在接受DOMWindow
在$(document).ready()
函数中,this
指的是document
。
因此,在test()
中设置窗口的值,这就是为什么window.value ==> 'foo'
,但是document.value ==> undefined
答案 1 :(得分:1)
this
是一个复杂的关键词,可以让您放心。
我建议通读这一点,它可能会有所帮助http://www.quirksmode.org/js/this.html
编辑:我还认为您的this.value
问题是由于范围界定造成的。您的函数与jQuery document.ready(..)
具有完全不同的范围。
答案 2 :(得分:1)
根据函数的调用方式,Javascript this
的工作方式不同。
我不会自己解释这些内容,而是会向您指出这篇文章,其中详细介绍了它:http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this
答案 3 :(得分:0)
function test()
{
this.value = "foo"; // this is window
}
$(document).ready(function () {
test();
alert(this.value); //--> this is window.document
alert(window.value); //--> return 'foo'
});
答案 4 :(得分:0)
我不习惯jquery,但解决方案应该很简单:
$(document).ready(...)
将用作参数的函数附加到文档对象的事件onReady。 函数的上下文应该是文档或事件(取决于您使用的框架)。
我们可以从行
开始分析onReady函数体 alert(this.value); //--> return undefined
返回undefined,因为从中指向的元素没有该属性。
诀窍在于
test();
你可能认为测试函数体中的 this 关键字是指外部函数的上下文,但javascript是 lexycally scoped ,函数的上下文是 在声明函数时定义,而不是在函数被调用时。
说你可以认为函数是全局函数然后它关联的this关键字是函数本身(在javascript中函数也是一个对象)然后如何测试污染窗口对象如清楚地指示按行
alert(window.value); //--> return 'foo'
当你调用一个函数(不是一个方法或一个构造函数)或者它的行为就像它是 window 对象的方法一样,然后在测试函数中你定义了它的value属性窗口对象。
完整的画面有点复杂但是theese是基础