为什么a.click(b.toggle)不起作用?

时间:2017-02-14 16:22:15

标签: javascript jquery event-handling

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/

2 个答案:

答案 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绑定将无法正确映射,因此代码将不知道要切换的内容。