1
function foo(obj, method, ...args) {
  if (!(method in obj)) return null;
  try {
    alert(!!obj); //shows true
    return obj[method].apply(obj, args);
  }
  catch (e) {
    alert(e);
  }
}

当我foo使用定义的对象、它的有效方法和一些参数调用时,它显示: TypeError: this is undefined.

这是什么意思?

我认为this在这里很重要,因为我正在使用apply谁的第一个参数将用作this调用的方法内部。但这里obj是有效的,它甚至不调用所需的方法。甚至在之前就发现了一个错误。

...args意味着任何额外的参数传递给fooafterobj并将method被推入一个args可以被使用的数组中foo

编辑: ...args是有效的。是ES6。

编辑:我的代码看起来非常好。我正在尝试检查被调用的函数是否有问题。对不起,如果是这样的话。

编辑:对不起,问题出在被调用的方法上。我曾说过不一样,但我很困惑。

其中还有另一个回调。

array.forEach(function (a) { // do something with 'this'});

this显然是未定义的,因为它没有引用该对象。

4

1 回答 1

1

演示

我把你的功能改成了这个。首先,我们缩小参数范围,以确保它们的类型正确。我们需要一个obj和一个method。此外,obj[method]最好是一个函数,因为我们正在尝试call它。

function foo(obj, method) {
  if (typeof obj === 'undefined' 
   || typeof method !== 'string' 
   || typeof obj[method] !== 'function') {
          return null;
  }

我不确定 ES6 是如何工作的,也没有办法对其进行测试,但这应该可以继续工作。如果你可以让它在没有的情况下工作,这是一个简单的改变(删除这一行,并添加一个参数)。

  var args = Array.prototype.slice.call(arguments, 2);
  return obj[method].apply(obj, args);e);
}

我们可以通过给它一个Person.

function Person(){
    this.say_name = function(first, last){
        alert('My name is ' + first + ' ' + last);
    };
}

var Me = new Person();
foo(Me, "say_name", "John", "Doe"); // shows "My name is John Doe"

只是问你是否需要进一步的解释。

于 2013-06-25T08:31:26.377 回答