访问"这"来自匿名函数

时间:2014-09-15 07:13:25

标签: javascript jquery class oop this

好的,这听起来可能非常简单,但是因为这是我第一次认真学习JavaScript / jQuery,我想知道最好的方法是什么。

所以,情况如下:

var someClass = function()
{
    var someProperty;

    /*********************************
     Initialisation
     *********************************/

    this.construct = function(options){

        this.someProperty = "someValue";

        $("#someDiv").click(function(){
            // I want to access "this" (= the someClass object) here
        });

    }
}

var theObj = new someClass();

现在,这就是:鉴于此,在我的特定情况下,theObj只是一个(全局)对象,我显然可以这样做:

$("#someDiv").click(function(){
     console.log(theObj.someProperty);
});

但我绝对不会喜欢它 - 并且必须有更优雅/面向对象的方式。


那么,你会怎么做呢?

4 个答案:

答案 0 :(得分:3)

由于您没有使用.prototype添加方法,而是在类中创建它们作为特权方法,因此只需在构造函数范围内使用引用该对象的其他变量:

var someClass = function() {

    var self = this;

    ...

};

这允许您保留this引用所单击元素的正常jQuery语义,同时使self可用于引用包装对象。出于语义保留的原因,我特别建议不要使用.bind(this)

关于在回调中使用theObj的最终提议的“解决方案” - 你也应该永远从内部通过自己的名称引用一个对象,因为这些名称不是在你的控制下,可能会改变。 可能在您当前的代码中是安全的,但它是代码维护和代码隔离的噩梦。

答案 1 :(得分:2)

您可以bind保持相同的背景:

$("#someDiv").click((function(){
        // same this as externally
}).bind(this));

或者你可以在闭包中定义一个变量:

var obj = this;
$("#someDiv").click(function(){
        // your this is obj
});

或者如果使用Firefox(以及其他浏览器),您可以使用箭头功能:

$("#someDiv").click(() => {
        // same this as externally
});

答案 2 :(得分:2)

有很多方法。你的是一个,它是最简单有效的方法之一,据我所知,它意味着更少的性能惩罚(它使用闭包)。

其他方法:

.bind(本)

bind更改了给定函数范围内this的含义。如果您执行以下操作,请单击处理程序此关键字将是更高的this参考:

 // This will bind outter "this" as the object referenced by 
 // inner this
 $("#someDiv").click(function(){
      console.log(this.someProperty);
 }.bind(this));

.call(this,arg1,argN)

call定义了被调用函数中this的引用。第一个参数是被调用函数作用域中this引用为this。下一个参数是可调用的函数参数(如果函数有它们)。 这不适用于点击处理程序用例

在某些情况下,您可能希望使用call。例如,如果要以某种自定义方式路由事件,并且事件处理程序接收自定义上下文:

 var that = this;

 $("#someDiv").click(function(){
      // Some handler function from the outter scope. It will have a "this"
      // reference to the outter "this" object reference
      someHandlerFunction.call(that, { currentElement: this, timeStamp: Date.now() });
 });

.apply(this,[arg1,argN])

call相同,函数参数在数组中给出,而不是像常规函数调用一样用逗号分隔的实际函数参数。 此外,不适用于您的用例

结论

首选方法:你的。 bind / call / apply方法性能较差,如果您在DOM事件处理程序中使用它会有很大的缺点:您失去了标准this的含义by DOM - 发起事件的DOM元素的引用 -

在其他边缘情况下使用bind,其中this表示window JavaScript对象,并且您希望避免闭包方法

答案 3 :(得分:1)

使用bind或保存对this的引用:

$("#someDiv").click((function() {
  console.log(this.someProperty);
}).bind(this));

var that = this;

$("#someDiv").click((function(){
   console.log(that.someProperty);
});