jQuery中的点击函数定义为 .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
,hide
,fadeIn
等)
更新:
关于参数,这似乎也有效:
var object1 = $("#object1");
var object2 = $("#object2");
object1.click(function(ev) { object2.toggle(ev); });
所以,无效的论点似乎不是问题。
答案:
对问题的解释是@seanwessell所说的,这是一个JSFIDDLE,以我更好地理解问题的方式显示了问题。不过,它与jQuery无关:https://jsfiddle.net/diegojancic/nffcnu8t/
这将不起作用,因为它将将处理程序分配给单击事件,为
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定义,并将其分配为处理程序,但是不再链接。
分配像 object1.click(object2.toggle);
的处理程序从object2.toggle中获取字面上的函数,并将其作为处理程序。这将与将一个对象的属性应用于另一个对象相同。
var obj1 = {
"prop1":"obj1PropValue"
};
var obj2 = {
"prop1":"obj2PropValue"
}
obj1.prop1 = obj2.prop1;
即使OBJ2.Prop1是从OBJ1 javaScript分配的,并不在乎该物业来自哪个对象,只关心分配的值。同样的想法适用于JavaScript中的功能。
函数不过是属性值。值为关键字。
JavaScript是在简单的基于对象的范式上设计的。一个对象是 财产的集合,财产是 名称(或键)和值。属性的值可以是一个函数,在 在哪种情况下,该属性被称为方法。除了对象 在浏览器中预定义的,您可以定义自己的对象。 本章介绍了如何使用对象,属性,功能和 方法,以及如何创建自己的对象。
https://developer.mozilla.org/en-us/docs/web/javascript/guide/working_with_objects
它可以从语法的角度接受,但由于调用上下文没有正确执行。如果您以这种方式引用该函数(而不是包裹在通过元素调用的另一个功能中),则this
绑定无法正确映射,因此代码不知道要切换什么。