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

有人可以在上面的代码中解释'this'的值吗?'this'内部的匿名关闭函数

我的理解:

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

编辑:顺便说一句我已经仔细阅读了解释“这”在此(How does the "this" keyword work?)后(从那里我得到了上面的代码)

+0

'this'与闭包无关,或者函数定义的方式 - 它只受函数调用方式的影响。 – user2246674 2013-04-30 16:54:17

+0

我明白了,但我只是从链接的帖子中复制了该行 – 2013-04-30 16:56:00

+2

还应该阅读链接的帖子/答案 - 接受的答案包含非常详尽的解释。然后它就成了一个问题:“为什么ThisBinding不像我预期的那样?” - 为此,请阅读*调用回调的方法的文档。在这种情况下,这将是['.each()'](http://api.jquery.com/each/) – user2246674 2013-04-30 16:56:48

回答

2

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

  1. 当一个函数被通过其特殊callapply方法调用,那么thiscallapply第一个参数。
  2. 当从通过其bind方法创建的绑定函数中调用函数时,thisbind的这个值参数。
  3. 当函数被调用为方法时(obj.method(params))则this是提取方法的对象,在本例中为obj
  4. 否则调用函数时,则this是非严格模式下的全局对象,否则为null

由于each使用在特殊的方法(1)到所述容器通过如thisthis在内部功能应该是$('.some-elements')结果,jquery的阵列包裹DOM节点。

+0

@Vlix,意识到我刚打完保存。请参阅我的编辑。 – 2013-04-30 16:54:27

+0

如果each()没有使用call/apply,而只是调用'4'中的回调函数,那么'this'会引用全局对象? – 2013-04-30 17:02:46

+0

@gyaani_guy,由于'每个'没有在严格模式下定义,是的。 – 2013-04-30 17:16:16

4

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

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

(顺便说一句,这使得有些多余即elt ARG;至少,这是一个有点不清楚你为什么要同时使用thiselt指同一件事有)

然而,并非所有的DOM元素都value属性定义:AFAIR,它的设置只对元素的子集:inputselecttextareaoption等这可能是为什么你undefined结果。

您可以轻松地通过使用jQuery.proxy()方法调整此:

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

现在送入.each()函数使用外this作为其上下文(很明显,它不再指向DOM元素,如elt一样)。

+1

Re“值属性...仅用于输入和选择”,'