& # 39;这个# 39;匿名闭包函数内部

'this' inside of anonymous closure functions

本文关键字:函数 内部 闭包 这个      更新时间:2023-09-26
(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 -为什么这个"可能"没有定义。请解释。

编辑:顺便说一句,我已经彻底阅读了这篇文章中"this"的解释(如何"this";关键词工作?)post

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

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

(BTW,这使得elt arg;至少,这有点不清楚为什么你使用thiselt指代相同的东西)

然而,并不是所有的DOM元素都有value属性定义:事务,它仅为元素的子集设置:input, select, textarea, option等。这可能就是为什么你得到undefined作为结果的原因。

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

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

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

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

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

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

第4行,this.value指的是$('.some-elements')的"each"实例。在任何函数内部,它都指向该函数正在操作的对象。在匿名函数的情况下,它是全局作用域。