2013-04-13 119 views
1

jsfiddle代码之前调用。什么我是我有一个Cal对象,由init功能,并呼吁Event另一个对象。里面Event我有两个功能initshow。我正在做的是调用init函数Cal对象并在那里传递参数。这里面init功能我打电话Eventinit功能和路过这里是相同的参数。这init功能里面我打电话show函数内Event当用户点击链接.button其显示在控制台param。但是,当我运行此代码时,它在控制台中显示param,然后单击.button为什么以及如何使其工作,以便在单击.button时显示参数?JavaScript函数点击按钮

这里是我的代码

var Cal = { 
    init: function (param) { 
     this.param = param; 
     Cal.Event.init(this.param); 
    }, 

    func: function() {}, 

    Event: { 
     init: function (param) { 
      $('.button').on('click', this.show(param)); 
     }, 

     show: function (param) { 
      console.log(param); 
     } 
    } 
} 

Cal.init('para'); 

回答

2

的返回值,在这行代码:

init: function (param) { 
    $('.button').on('click', this.show(param)); 
}, 

你是来电show函数,然后将其返回值传递到on,因此它在您拨打Cal.Event.init时运行。点击发生时,您不会给on代码发送电话。要做到这一点,把它放在一个事件处理函数:

init: function (param) { 
    $('.button').on('click', function() { 
     Cal.Event.show(param); 
    }); 
}, 

请注意,我因为调用处理函数内改变thisCal.Eventthis将是按钮,而不是Cal.Event参考。

+0

也许downvoter想和大家分享,为什么他/她觉得这样的回答是“没有用处”(使用来自downvote按钮术语)? –

4

。对()预计参数2是一个函数,而不是函数

$('.button').on('click', function() { 
    // Here this points to the button DOM object. 
    Cal.Event.show(param) 
}); 
2

您立即拨打this.show(param)。它改成这样:

init: function (param) { 
    $('.button').on('click', $.proxy(function() { 
     this.show(param); 
    }, this)); 
}, 

http://jsfiddle.net/9SLEX/3/

+0

为什么在这个例子中使用'$ .proxy()'? – 2619

+0

@ x4ph4r为了保留上下文,点击处理程序'this'将指向'Cal.Event'对象。如果你想让上下文成为'.button',那么你应该使用Virus721的建议。 – dfsq