Javascript jQuery';s`$(this)`引用正确的节点?

Javascript jQuery';s`$(this)`引用正确的节点?,javascript,jquery,this,internals,Javascript,Jquery,This,Internals,我知道如何使用jQuery的$(this)选择器,我还了解Javascript中OOP的原理。我一直认为它是有效的,因为其他人实现了它,但我很想知道它为什么有效以及如何有效 $(function(){ $('.foo').each(function(){ console.log($(this)); }); }); 给定这个代码。我知道$('.foo')查找一组HTML元素并返回一个jQuery对象,该对象能够使用对它们进行迭代。每个(…)。each()方法的内部结构可能

我知道如何使用jQuery的
$(this)
选择器,我还了解Javascript中OOP的原理。我一直认为它是有效的,因为其他人实现了它,但我很想知道它为什么有效以及如何有效

$(function(){
   $('.foo').each(function(){
      console.log($(this));
   });
});
给定这个代码。我知道
$('.foo')
查找一组HTML元素并返回一个jQuery对象,该对象能够使用
对它们进行迭代。每个(…)
each()
方法的内部结构可能会调用闭包,闭包已作为参数传递


但是为什么
这个
然后引用闭包中的特定HTML元素呢?我一直认为,
this
只会引用一个新的范围,因为它的包装器是使用
new
实例化的。因此,如果
这个
引用了
窗口
,不是会更加一致吗?

最后,您可以使用
调用
应用
在函数中强制执行
这个
值。jQuery做到了这一点;看看下面的例子:


这里,
this
值将被设置为元素(
object[i]
),计数器(
i
)和元素将作为参数传递给函数,它是
回调

它是对所有匹配元素的简单迭代,使用类
.foo
,并使用
.call/.apply
调用内部函数

检查
。每个
实现

注意下面代码中的.call/.apply调用,确保
.foo[i]

jQuery
。每个实现

function (object, callback, args) {
    var name, i = 0,
        length = object.length,
        isObj = length === undefined || jQuery.isFunction(object);
    if (args) {
        if (isObj) {
            for (name in object) {
                if (callback.apply(object[name], args) === false) {
                    break;
                }
            }
        } else {
            for (; i < length;) {
                if (callback.apply(object[i++], args) === false) {
                    break;
                }
            }
        }
    } else {
        if (isObj) {
            for (name in object) {
                if (callback.call(object[name], name, object[name]) === false) {
                    break;
                }
            }
        } else {
            for (; i < length;) {
                if (callback.call(object[i], i, object[i++]) === false) {
                    break;
                }
            }
        }
    }
    return object;
}
函数(对象、回调、参数){
变量名称,i=0,
长度=object.length,
isObj=长度===未定义的| | jQuery.isFunction(对象);
如果(args){
if(isObj){
for(对象中的名称){
if(callback.apply(对象[名称],参数)==false){
打破
}
}
}否则{
对于(;i
之所以说“为什么”,是因为这是如何定义操作的:

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

不需要这样做,但确实如此。(有关使用的“方式”机制,请参见和。)


快乐编码

这在javascript中很奇怪。搜索网页,你会发现有无数人在博客上解释它,我知道存在
.call()
,但我没有想到将它与一个参数结合使用,这个参数是HTML元素。我想不出更好的答案,这很好地解释了这一点。谢谢大家!@YMMD:事实上,它与您可以传递到
.call
的任何内容都没有太大区别。如果传递一个包含元素的变量,则该元素将是
this
值。如果不是,则唯一的可能是向引用该元素的回调传递一个参数,或者是否有其他方法?谢谢你的快速回答!
function (object, callback, args) {
    var name, i = 0,
        length = object.length,
        isObj = length === undefined || jQuery.isFunction(object);
    if (args) {
        if (isObj) {
            for (name in object) {
                if (callback.apply(object[name], args) === false) {
                    break;
                }
            }
        } else {
            for (; i < length;) {
                if (callback.apply(object[i++], args) === false) {
                    break;
                }
            }
        }
    } else {
        if (isObj) {
            for (name in object) {
                if (callback.call(object[name], name, object[name]) === false) {
                    break;
                }
            }
        } else {
            for (; i < length;) {
                if (callback.call(object[i], i, object[i++]) === false) {
                    break;
                }
            }
        }
    }
    return object;
}