Javascript 为什么在作用于jQuery对象的函数中使用$(this)?

Javascript 为什么在作用于jQuery对象的函数中使用$(this)?,javascript,jquery,scope,closures,this,Javascript,Jquery,Scope,Closures,This,据我所知,函数内部的这个是指调用函数的对象。例如,在 myObj = { name : "Charlie", getType : function() { return typeof(this); } }; console.log(myObj.getType()); $('.not-taller-than-50-pixels').each(function() { if ($(this).height() > 50) $(this).height(50); }); 调用函

据我所知,
函数内部的这个
是指调用函数的对象。例如,在

myObj = { name : "Charlie", getType : function() { return typeof(this); } }; 
console.log(myObj.getType()); 
$('.not-taller-than-50-pixels').each(function()
{
     if ($(this).height() > 50) $(this).height(50);
});
调用函数
getType
的对象是
myObj
,因此
typeof(this)
typeof(myObj)

那么,为什么我总是在jQuery函数中看到
$(this)
?例如,在

myObj = { name : "Charlie", getType : function() { return typeof(this); } }; 
console.log(myObj.getType()); 
$('.not-taller-than-50-pixels').each(function()
{
     if ($(this).height() > 50) $(this).height(50);
});
$('.not-higher-than-50-pixels')
返回一个jQuery对象数组,因此在
中,每个
调用函数都是一个jQuery对象,因此
这个
将引用该jQuery对象,我可以简单地编写
如果(this.height()>50)这个.height(50)

据我所知,函数的内部是指调用函数的对象

如果函数被作为该对象的属性调用,则这是正确的。但是,在您的情况下,jQuery集合并不是作为jQuery集合的属性调用函数,而是使用
.apply
.call
来调用函数,以将其上下文设置为当前正在迭代的元素

它的工作方式类似于
Array.prototype.forEach
的工作方式。我假设相似性是故意的,所以对于大多数也熟悉本机方法的开发人员来说,它似乎很熟悉


下面是一个与您的第一个代码片段更为内联的示例,它将按照您期望的方式运行:

$.fn.alertHeight=函数(){
警报(this.height());
}
$('body').alertHeight()

你好,世界

据我所知,函数的内部是指调用函数的对象

如果函数被作为该对象的属性调用,则这是正确的。但是,在您的情况下,jQuery集合并不是作为jQuery集合的属性调用函数,而是使用
.apply
.call
来调用函数,以将其上下文设置为当前正在迭代的元素

它的工作方式类似于
Array.prototype.forEach
的工作方式。我假设相似性是故意的,所以对于大多数也熟悉本机方法的开发人员来说,它似乎很熟悉


下面是一个与您的第一个代码片段更为内联的示例,它将按照您期望的方式运行:

$.fn.alertHeight=函数(){
警报(this.height());
}
$('body').alertHeight()

你好,世界

我们使用
$(this)
,因为否则
this
没有getter/setter方法
.height()
$()
为所有选定元素提供对jquery方法的访问权限,而普通javascript等价物没有这些方法。尝试
console.log($(this),“VS”,this)
记住
$()
是一个函数。

我们使用
$(this)
,因为否则
this
没有getter/setter方法
.height()
$()
为所有选定元素提供对jquery方法的访问权限,而普通javascript等价物没有这些方法。尝试
console.log($(this),“VS”,this)请记住,
$()
是一个函数

$('.not-higher-than-50-pixels')不返回jQuery数组吗 物体

否,
$('.not-higher-than-50-pixels')
不返回JQuery对象数组。它返回单个JQuery对象,该对象可以封装零个、一个或多个DOM元素

因此在每个调用函数中都有一个jQuery 对象,所以这将引用jQuery对象,我可以 如果(this.height()>50)this.height(50);?,则写入

传递给
.each()
的回调函数被JQuery对象包装的每个DOM元素调用,调用回调函数时,DOM元素被用作上下文。也就是说,在回调函数
中,这个
将引用DOM元素,而不是JQuery对象

这在函数的JQuery文档中有说明:

调用时,它将迭代作为 jQuery对象。每次回调运行时,都会将当前 循环迭代,从0开始。更重要的是,回调是 在当前DOM元素的上下文中激发,因此关键字
this
指的是元素

$('.not-higher-than-50-pixels')不返回jQuery数组吗 物体

否,
$('.not-higher-than-50-pixels')
不返回JQuery对象数组。它返回单个JQuery对象,该对象可以封装零个、一个或多个DOM元素

因此在每个调用函数中都有一个jQuery 对象,所以这将引用jQuery对象,我可以 如果(this.height()>50)this.height(50);?,则写入

传递给
.each()
的回调函数被JQuery对象包装的每个DOM元素调用,调用回调函数时,DOM元素被用作上下文。也就是说,在回调函数
中,这个
将引用DOM元素,而不是JQuery对象

这在函数的JQuery文档中有说明:

调用时,它将迭代作为 jQuery对象。每次回调运行时,都会将当前 循环迭代,从0开始。更重要的是,回调是 在当前DOM元素的上下文中激发,因此关键字
this
指的是元素


不,
将是当前正在迭代的元素,它不是jQuery对象,而是jQuery对象中的元素。“类似数组”对象中的单个值。与使用
[1,2,3]时获取数组值的方式相同。forEach
,例如
1
2
3
,而不是