2011-08-13 2 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 확장의 콜백 매개 변수 만 변경됩니다. 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으로 설정해야합니다.개체입니다.

수단

에는 thiswidgetElement 개체로 전달하기 위해

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

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

로 변경한다. 위해

+0

예! 이런! 저는 항상 첫 번째 매개 변수가 "무엇을 수정해야 할 것"이라고 생각했습니다. 나는. '.call (widgetElement, 'duh')'를 호출하면 콜백에서 첫 번째 매개 변수는'duh'와 같습니다. 고마워요. 한 번 시간이 지나면 올바른 표시로 잘못 표시됩니다 ... –

0

적절하게, 당신은 .call() 또는 중 하나 .apply()와 콜백 함수를 실행하고 원하는 this 전달 this 세트를 얻을 수 있습니다. FN은 매개 변수로 Core.extend()에 전달하는 기능입니다

그래서, Core.extend() 또는 Core.load(), 내부 사용자가 기능에 전달 호출하려고 할 때, 당신은 fn.call(xxx, message)을 사용, xxx 방금 ​​만든했던 div 요소였다.

정확히 무엇을 하려는지는 모르지만 지점을 .call() 또는 .apply()으로 설정했습니다. 그들이 어떻게 작동하는지 알 수 있습니다. herehere. 이것에

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

: 당신의 코드에서, 당신이 변경해야처럼 보이는 .call에 첫 번째 인자이기 때문에 당신이 this 포인터로 원하는

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

을 두 번째 인수는 무엇입니까 당신은 함수에 전달되기를 원하고 예제에서 함수는 오직 하나의 매개 변수만을 취하므로 필요한 모든 것이 있다고 가정합니다.