使用javascript进行非法调用?

使用javascript进行非法调用?,javascript,Javascript,我有一个功能: var doThis = function(callback){ callback('google.com'); } 如果我这样做,它会起作用: doThis(alert); 但如果我这样做,我会得到一个错误: doThis(window.location.replace); 未捕获类型错误:非法调用 我正在为AJAX调用构建一个包装器,我需要支持像alert、自定义函数以及window.location.replace这样的函数。我做错了什么 Fiddle:您可

我有一个功能:

var doThis = function(callback){
     callback('google.com');
}
如果我这样做,它会起作用:

doThis(alert);
但如果我这样做,我会得到一个错误:

doThis(window.location.replace);
未捕获类型错误:非法调用

我正在为AJAX调用构建一个包装器,我需要支持像
alert
、自定义函数以及
window.location.replace
这样的函数。我做错了什么


Fiddle:

您可以使用
.bind

doThis(window.location.replace.bind(window.location));
你可以试试

doThis(function(x) {
    window.location.replace(x);
});


当您将函数存储在与预期不同的上下文中时,它将不再能够访问以前访问过的属性。例如:

var myObj = {
    foo: "foo",
    alert: function(){
        alert(this.foo);
    }
}

myObj.alert(); // "foo"
var a = myObj.alert;
a(); // undefined.
当作为myObj的属性执行警报函数时,它可以访问this.foo,但是,当您将该函数存储在其他位置时,它将不再具有访问该函数的权限。要解决此问题,请存储一个执行该函数的匿名函数

var myObj = {
    foo: "foo",
    alert: function(){
        alert(this.foo);
    }
}

myObj.alert(); // "foo"
var a = function(){myObj.alert();}
a(); // "foo".
并应用于您的代码:

doThis(function(){window.location.replace();});

因为您正在传递存储在window.location.replace属性中的函数,这意味着函数的上下文现在是
window
而不是
location
,因此它失败了。为什么要标记jQuery?因为我累了。晚安@rlemonThank这里的细节非常感谢你。关于
window.location.replace.bind(window.location)
的想法?它可以工作,但我更喜欢将函数留在原处,只执行它。使用匿名函数还为您提供了更大的灵活性,并支持更多的浏览器。(Function.prototype.bind在IE8中不受支持,IE8还没有完全消亡。)太酷了,再次感谢您提供的信息。我会尽快接受。请添加一个解释,说明这段代码是如何工作的,以及它是如何解决问题的。这似乎与问题无关。
doThis(function(){window.location.replace();});
var myObj = {
    foo: "foo",
    alert: function(){
       return  alert(this.foo);
    }
}

var a  = myObj.alert(); // "foo"