2011-08-13 56 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是,第二個參數是什麼你想傳遞給函數,你的例子中的函數只需要一個參數,所以我認爲這就是你需要的。