0

假设我有一个namespace和几个functions ,例如以这种方式:

HTML

<input type="button" class="btn" value="click">

JAVASCRIPT

var nms = {
 doAlert: function(){
     alert('doing alert');
     console.log(this);
 },
 bindBtn: function(){
     var that = this;
     $('.btn').on('click', that.doAlert);
 }

}

nms.bindBtn();

换句话说,打印log是 指我正在执行的元素。<input type="button" class="btn" value="click">thisfunction

这可能是我的不足,但我想了解如何引用nms而不是input. 如果可能,使用this

4

4 回答 4

2

您应该使用proxy() jquery 的方法来应用特定的上下文:

$('.btn').on('click', $.proxy( this.doAlert, this ));

演示

于 2013-07-13T11:38:53.923 回答
1

有很多方法可以做到这一点。我更喜欢在IIFE(立即调用的函数表达式)中定义对象,以便它可以使用私有变量来跟踪自身:

var nms = (function () {
    var myownself = {
        doAlert: function () {
            alert('doing alert');
            console.log(myownself);
        },
        bindBtn: function () {
            $('.btn').on('click', myownself.doAlert);
        }
    };
    return myownself;
})();

nms.bindBtn();

演示:http: //jsfiddle.net/Yu5Mx/

这样,该对象的所有方法都可以仅引用该myownself变量,但它们不需要知道nms其余代码通过该变量知道该对象的变量。如果您执行以下操作:

var temp = nms.bindBtn;
temp();

...这“弄乱”了 inside 的值,this那么bindBtn()这并不重要,因为bindBtn()仍然会使用myownself.

请注意,此模式假定nms它将是一个单例对象。如果您希望能够实例化多个副本,您仍然可以使用相同的一般想法,但使用工厂函数或常规构造函数new(而不是 IIFE)。

于 2013-07-13T11:39:01.467 回答
0
var nms = {
 doAlert: function(){
     alert('doing alert');
     console.log(this);
 },
 bindBtn: function(){
     $('.btn').on('click', nms.doAlert.bind(nms));
 }
}

要支持 IE 绑定,您可以使用此

于 2013-07-13T11:32:13.327 回答
0

尝试这个

var nms = {
 doAlert: function(){
     alert('doing alert');
     console.log(this);
 },
 bindBtn: function(){
     var that = this;
     $('.btn').on('click', function(){
        nms.doAlert.apply(that);

     });
 }

}

nms.bindBtn();

演示

that通过函数作为this

你也可以用call()这个

一些链接

应用() 调用();

或不使用呼叫或申请

var nms = {
 doAlert: function(){
     var _this = nms;
     alert('doing alert');
     console.log(_this);
 },
 bindBtn: function(){
     var that = this;
     $('.btn').on('click', nms.doAlert);
 }

}

nms.bindBtn();

演示

于 2013-07-13T11:39:49.940 回答