TypeError:这是未定义的

时间:2013-06-25 08:17:41

标签: javascript ecmascript-harmony

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);
  }
}

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

这是什么意思?

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

...args表示在fooobj之后传递给method的任何额外参数将被推送到数组argsfoo可供...args使用1}})

编辑: array.forEach(function (a) { // do something with 'this'}); 有效。这是ES6。

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

编辑:很抱歉,问题原来是被调用的方法。我没有说过,但我很困惑。

还有另一个回调。

this

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

1 个答案:

答案 0 :(得分:1)

demo

我把你的功能改成了这个。首先,我们缩小参数范围,以确保它们的类型正确。我们需要objmethod。此外,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"

请询问您是否需要进一步解释。