2011-08-13 74 views
7

我正在用一些方法构建一个库,并且我有一个方法extend和一个方法load。我想它是这样工作的:在JavaScript中更改函数“this”的值

Core.extend('name',function(message){ 
    this.innerHTML = message; 
}); 

然后实际运行这一点,你会怎么做:

Core.load('name','Hey!'); 

Core.extend()创建基于名称的唯一ID的<div>元素。我想让this ==生成的<div>

我知道.call().apply(),很明显,但它不会改变this它只是改变回调参数。下面是扩展和负载代码:

Core.extend()

var extend = function(name,func){ 
    name = name || ''; 
    func = func || function(){}; 
    if(typeof extensions[name] == 'undefined'){ 
    extensions[name] = func; 
    } 
    else{ 
    if(errors){ 
     throw new Error('Core extend() error: the extension "'+name+'" already exists'); 
    } 
    } 
} 

Core.load()

注意这是主线:extensions[name].call(this,widgetElement,params);

var load = function(name,params,sel){ 
    name = name || ''; 
    params = params || ''; 
    sel = sel || ''; 
    if(typeof extensions[name] !== 'undefined'){ 
    var widgetElement = document.createElement(settings.widgetWrapperElement); 
    widgetElement.setAttribute('id',settings.prefixOnWidgetId+name); 
    sel.appendChild(widgetElement); 
    extensions[name].call(this,widgetElement,params); 
    } 
    else{ 
    if(errors){ 
     throw new Error('Core load() error: the extension "'+name+'" doesn\'t exist'); 
    } 
    } 
} 

回答

7

Function.call函数的第一个参数应该是你想要设置的this对象。

这意味着,你应该改变

extensions[name].call(this, widgetElement, params); 

extensions[name].call(widgetElement, params); 

为了通过widgetElement作为this对象。

+0

是的!咄!我一直认为第一个参数是“要修改的东西”。即如果我做了'.call(widgetElement,'duh')',那么在我的回调中,第一个参数将等于'duh'。谢谢:) P.S.一旦时间流逝,病毒标记为正确... –

0

为了得到this适当设置,你要么.call().apply()执行回调函数,并传递所需的this

所以,Core.extend()Core.load(),里面当你要调用函数传递的,你可以使用fn.call(xxx, message)其中,fn是传递给Core.extend()作为参数的函数,xxx是你刚刚创建的div元素。

我并不完全按照您要做的所有事情做,但您将this点设置为.call().apply()。你可以看到他们是如何工作的herehere。在代码中,它看起来像你应该改变这样的:

extensions[name].call(this,widgetElement,params); 

这样:你想要的this指针是什么

extensions[name].call(widgetElement, params); 

以来的第一个参数.call是,第二个参数是什么你想传递给函数,你的例子中的函数只需要一个参数,所以我认为这就是你需要的。