为什么以及如何jQuery的`$(this)`引用正确的节点?

YMM*_*MMD 3 javascript jquery internals this

我知道如何使用jQuery的$(this)选择器,我也理解Javascript中的OOP原理.我总是接受它只是有效,因为其他人实现了它,但我很想知道它为什么以及如何工作.

$(function(){
   $('.foo').each(function(){
      console.log($(this));
   });
});
Run Code Online (Sandbox Code Playgroud)

鉴于此代码.我知道$('.foo')找到一组HTML元素并返回一个jQuery对象,它可以使用它迭代它们.each(...).然后,该each()方法的内部结构可能会调用闭包,该闭包已作为参数传递.

但是为什么this然后引用闭包内的特定HTML元素呢?我一直以为this只会引用一个新的范围,只要它的包装器已经使用实例化new.相反,如果this引用它会不会更加一致window

pim*_*vdb 8

最后,您始终可以this使用.call或强制函数中的值.apply.jQuery做到了这一点; 看看来源.each:

if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
//                  ^ `this` value
Run Code Online (Sandbox Code Playgroud)

这里,this值将被设置为element(object[i]),并且counter(i)和元素作为参数传递给您的函数,即callback.