'this'在匿名闭包函数中

时间:2013-04-30 16:48:35

标签: javascript jquery this

(function(value) {
    this.value = value;
    $('.some-elements').each(function(elt){
        elt.innerHTML = this.value;        // possibly undefined (Why?)
    });
})(2);

有人可以在上面的代码中解释'this'的价值吗?

我的理解:

this.value = value // Line 2 - 这里指的是全局对象 elt.innerHTML = this.value; // line 4 - 为什么这个'可能'未定义。请解释一下。

编辑:顺便说一下,我已经在这篇(How does the "this" keyword work?)帖子(我从上面得到上面的代码)中详细阅读了“this”的解释。

3 个答案:

答案 0 :(得分:4)

在作为回调发送到.each()方法的函数内部,this引用DOM元素(对于此集合中包含在jQuery对象中的每个元素),而不是window

  

更重要的是,回调是在当前的上下文中触发的   DOM元素,因此关键字this引用元素。

(顺便说一句,这有点多余elt arg;至少,为什么你同时使用thiselt来引用它们有点不清楚事情那里)

然而,并非所有DOM元素都定义了value属性:afair,它仅针对元素的子集设置:inputselecttextarea,{{1}这可能是你得到option的原因。

您可以使用jQuery.proxy()方法轻松调整此选项:

undefined

现在发送到$('.some-elements').each($.proxy(function(elt){ elt.innerHTML = this.value; }, this)); 的函数使用外部.each()作为其上下文(显然,它不再指向DOM元素,正如this那样)。

答案 1 :(得分:2)

在第4行中,this.value指的是$('.some-elements')的“每个”实例。在任何函数内部,它然后引用该函数正在操作的对象。在匿名函数的情况下,它是全局范围。

答案 2 :(得分:2)

JS解释器用来确定this的基本算法如下所示。

  1. 当通过特殊的callapply方法调用函数时,thiscallapply的第一个参数。
  2. 当从通过bind方法创建的绑定函数调用函数时,thisbind的this-value参数。
  3. 当函数作为方法(obj.method(params))调用时,this是从中提取方法的对象,在示例中为obj
  4. 当以其他方式调用函数时,this是非严格模式下的全局对象,否则为null
  5. 由于each使用(1)中的特殊方法将容器作为this传递,因此内部函数中的this应该是$('.some-elements')的结果,一个数组jquery包装了DOM节点。