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
表示在foo
和obj
之后传递给method
的任何额外参数将被推送到数组args
,foo
可供...args
使用1}})
编辑: array.forEach(function (a) { // do something with 'this'});
有效。这是ES6。
编辑:我的代码看起来非常好。我正在尝试检查被调用的函数是否有问题。对不起,如果是这样的话。
编辑:很抱歉,问题原来是被调用的方法。我没有说过,但我很困惑。
还有另一个回调。
this
{{1}}显然是未定义的,因为它没有引用该对象。
答案 0 :(得分: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"
请询问您是否需要进一步解释。