2011-08-13 4 views
7

私はいくつかの方法でライブラリを構築していますが、方法はextendで、方法はloadです。JavaScriptの関数 "this"値を変更する

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

Core.extend()は名前に基づいて一意のIDを持つ<div>要素を作成します。実際にあなたがしたい、これを実行するためにその後

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

を:私はそれがこのように動作するようにしたいと思います。私はthis ==生成された<div>を作りたいと思う。

私は約.call().apply()を知っていますが、明らかに変更されていません。this拡張のコールバックパラメータのみが変更されます。 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'); 
    } 
    } 
} 
:これはメインラインである

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()

注:ここで拡張し、負荷のためのコードです

答えて

7

Function.call関数の最初の引数は、0に設定するものでなければなりませんオブジェクトです。意味

、あなたはthisオブジェクトとしてwidgetElementを渡すために

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

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

を変更する必要があります。

+0

はい!ダー!私はいつも最初のパラメータが "何を修正するか"と考えていました。私。 '.call(widgetElement、 'duh')'を実行した場合、コールバックで最初のパラメータは 'duh'になります。ありがとう:) P.S.時間が経つと一度正しいと思っています。 –

0

適切thisセットを取得するために、あなたは.call().apply()のいずれかでコールバック関数を実行して、必要なthisに渡します。 FNは、パラメータとしてCore.extend()に渡された関数である

ので、Core.extend()またはCore.load()、内部には、関数に渡された呼び出ししようとしているとき、あなたはfn.call(xxx, message)を使用することになり、xxxは、先ほど作成したdiv要素でした。

私は何をしようとしているのか正確には追いませんが、のポイントを.call()または.apply()に設定しています。彼らはどのように動作するかを見ることができますherehere.callへの最初の引数はあなたがthisポインタがあることを望むものであり、第二引数は何であるので、

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

:これまで

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

:あなたはこれを変更する必要がありますようにあなたのコードでは、それが見えますあなたの関数に渡されたい、あなたの関数の関数は1つのパラメータしか取らないので、私はそれがあなたが必要とするすべてであると推測します。

関連する問題