jQuery中的click函数定义为.click( handler )
,为什么我不能执行以下操作:
var object1 = $("#object1");
var object2 = $("#object2");
object1.click(object2.toggle);
然而,以下内容有效:
var object1 = $("#object1");
var object2 = $("#object2");
object1.click(function() { object2.toggle(); });
问题是,为什么我必须将函数处理程序封装在另一个函数中才能使它工作?我知道在第一个例子中,toggle
函数将接收所有事件数据,但它似乎没有影响(同样,其他函数,如show
,{{1 },hide
等)
更新
关于论点,这似乎也有效:
fadeIn
因此,无效的参数似乎不是问题。
解答:
问题的解释是@SeanWessell所说的,这里是一个JSFiddle以我更好理解的方式显示问题。它与jQuery无关:https://jsfiddle.net/diegojancic/nffcnu8t/
答案 0 :(得分:1)
这不起作用,因为它会将处理程序分配给click事件
function ( speed, easing, callback ) {
return speed == null || typeof speed === "boolean" ?
cssFn.apply( this, arguments ) :
this.animate( genFx( name, true ), speed, easing, callback );
}
当您尝试分配像object1.click(object2.toggle);
这样的处理程序时,它与执行此操作相同。
object1.click(
function(speed, easing, callback) {
return speed == null || typeof speed === "boolean" ?
cssFn.apply(this, arguments) :
console.log(this)
this.animate(genFx(name, true), speed, easing, callback);
}
);
处理程序不关心示例中对object2的引用。它将采用jquery定义的toggle函数并将其指定为处理程序,但它不再被链接。
分配像object1.click(object2.toggle);
这样的处理程序从object2.toggle获取字面函数并将其作为处理程序应用。它与将一个对象的属性应用于另一个对象相同。
var obj1 = {
"prop1":"obj1PropValue"
};
var obj2 = {
"prop1":"obj2PropValue"
}
obj1.prop1 = obj2.prop1;
即使obj2.prop1是从obj1分配的,javascript并不关心属性来自哪个对象,它只关心分配的值。同样的想法适用于javascript中的函数。
一个函数只不过是属性VALUE。值是关键字。
JavaScript是基于简单的基于对象的范例设计的。一个对象是 一组属性,一个属性是一个关联 名称(或键)和值。 属性的值可以是函数 在哪种情况下,该属性称为方法。 除了对象 在浏览器中预定义的,您可以定义自己的对象。 本章介绍如何使用对象,属性,函数和 方法,以及如何创建自己的对象。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
答案 1 :(得分:0)
从语法角度来看,这是可以接受的,但由于调用上下文而无法正确执行。如果以这种方式引用函数(而不是包含在通过元素调用的另一个函数内),this
绑定将无法正确映射,因此代码将不知道要切换的内容。