Javascript:'this'的问题

时间:2011-05-06 12:34:39

标签: javascript

这是一段代码

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

$(document).ready(function () {
    test();
    alert(this.value);   //--> return undefined
    alert(window.value); //--> return 'foo'
});

有人能解释一下这些结果吗?

此致

的Salvatore

5 个答案:

答案 0 :(得分:6)

在您的函数test()中,this正在接受DOMWindow

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

因此,在test()中设置窗口的值,这就是为什么window.value ==> 'foo',但是document.value ==> undefined

Read this article on function scope which might help

答案 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是基础