在JavaScript中更改函数"this"值

Osc*_*son 7 javascript this

我正在用一些方法构建一个库,我有一个方法extend和一个方法load.我喜欢它像这样工作:

Core.extend('name',function(message){
  this.innerHTML = message;
});
Run Code Online (Sandbox Code Playgroud)

然后实际运行这个你做的:

Core.load('name','Hey!');
Run Code Online (Sandbox Code Playgroud)

Core.extend()<div>根据名称创建一个具有唯一ID 的元素.我想让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');
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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');
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*son 7

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

这意味着,你应该改变

extensions[name].call(this, widgetElement, params);
Run Code Online (Sandbox Code Playgroud)

extensions[name].call(widgetElement, params);
Run Code Online (Sandbox Code Playgroud)

以传递widgetElementthis对象.