在JavaScript中的函数表达式中引用它,

时间:2014-04-18 20:58:25

标签: javascript

我有一个像这样的资源对象:

var resource = {
    ...
    All sorts of nifty stuff;
    ...
};

我想动态创建一个函数表达式,并使用关键字this引用我的资源对象中的其他函数:

resource.url = function(){
    return this.constructbaseUrlParams() +
           this.constructReqeustParams();
}();

但是this在这里引用window对象。

我知道我可以使用:

resource.url = function(){
    return resource.constructbaseUrlParams() +
           resource.constructReqeustParams();
}();

但我想使用this,因此该函数可以更加模块化,并且可能允许我在将来创建多个资源对象而不会出现问题。

我如何在我的函数表达式中使用它并仍然引用我的对象?

4 个答案:

答案 0 :(得分:2)

使用callthis内部指定值:

resource.url = function(){ ... }.call(resource);

或使用bind

var fn = function() { ... }.bind(resource);
resource.url = fn();

答案 1 :(得分:2)

this的值取决于function的调用方式。

并且,没有使用任何关联的上下文对象调用IIFE。它只是默认为全局对象window

您可以使用.call()指定IIFE的上下文:

resource.url = function () {

    console.log(resource === this); // true

    return this.constructbaseUrlParams() +
           this.constructReqeustParams();

}.call(resource);

答案 2 :(得分:1)

您可以在对象上创建一个新的url函数,而不是直接调用它:

var resource = {
   foo: function() {
      console.log('foo');   
   } 
};

resource.url = function() {
    this.foo();   
}

resource.url(); //foo 

此外,如果您想轻松创建具有不同url函数的资源的新实例,则可以在函数中移动资源对象:

function Resource() {
    return {
        foo: function() {
            console.log('foo');   
        }
    }
}

var r1 = new Resource();
var r2 = new Resource();

r1.url = function() {
    this.foo();   
}

r1.url(); //foo
r2.url(); //undefined

答案 3 :(得分:0)

资源可以变成一个类。

function Resource() {
    this.constructbaseUrlParams = function() {
        return "test";
    };

    this.constructReqeustParams = function() {
        return "test2";
    };

    this.url = function() {
        return this.constructbaseUrlParams() +
               this.constructReqeustParams();
    }
};

var resource = new Resource();
console.log(resource.url());