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

Can someone explain the value of 'this' in the above code please ?

My understanding:

this.value = value // Line 2 - here this refers to the global object elt.innerHTML = this.value; // line 4 - why is this 'possibly' undefined. Please explain.

Edit: btw I have thoroughly read the explanation for 'this' in this( How does the "this" keyword work? ) post ( from where I got the above code)

4

3 回答 3

3

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

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

(顺便说一句,这使得eltarg 有点多余;至少,有点不清楚你为什么同时使用这两者thiselt在那里指代相同的东西)

然而,并非所有 DOM 元素都value定义了属性:公平,它仅为元素的一个子集设置:inputselecttextareaoption。这可能是您得到结果的undefined原因。

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

$('.some-elements').each($.proxy(function(elt){
    elt.innerHTML = this.value;
}, this));

现在发送到的函数.each()使用外部this作为它的上下文(显然,它不再指向 DOM 元素,就像现在elt一样)。

于 2013-04-30T16:51:11.417 回答
1

在第 4 行,this.value指的是$('.some-elements'). 在任何函数内部,它指的是函数正在操作的对象。在匿名函数的情况下,它是全局范围。

于 2013-04-30T16:52:08.390 回答
1

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

  1. 当一个函数通过其特殊的callandapply方法调用时, thenthiscallor的第一个参数apply
  2. bind当从通过其方法创建的绑定函数调用函数时,则thisthis-value 参数为bind.
  3. 在示例中,当函数作为方法 ( obj.method(params))调用时,this就是从中获取方法的对象obj
  4. 当以其他方式调用函数时,this则为非严格模式或null其他方式的全局对象。

由于each使用 (1) 中的特殊方法将容器作为 传递thisthis因此在内部函数中应该是 的结果$('.some-elements'),一个 jquery 包装的 DOM 节点数组。

于 2013-04-30T16:52:49.540 回答