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
,而不是