为什么我不能在替换函数中使用.call()?

时间:2011-02-10 14:41:36

标签: javascript reference replace call

为什么这有效:

function func(a,b,c) {
    console.log(this, a,b,c);
    return '';
}
'testing'.replace(/e/, func);

但这不是:

function func(a,b,c) {
    console.log(this, a,b,c);
    return '';
}
'testing'.replace(/e/, func.call);

如果func是函数引用,并且call是函数引用,那么它们是否都可以工作?

以下是此

fiddle

2 个答案:

答案 0 :(得分:6)

因为当您传递call函数时,您将其从func的上下文中删除,因此在callthis关键字将引用window而不是func

window不是函数,但call期望this成为函数,因此它会中断。

进行比较。

var AnObject = {
    call: function () { console.log("this.location is: ", this.location); },
    location: "This string is the location property of AnObject"
};

AnObject.call();
setTimeout(AnObject.call, 500);

答案 1 :(得分:1)

因为.call()本身是一种方法,但不是对replace()有用的方法。

换句话说,虽然你的目的是传递func,但实际上你传递的是一个完全不同的函数(call),这个函数用作.replace()的参数无用的目的。