我有一个功能:
var doThis = function(callback){
callback('google.com');
}
如果我这样做,它会起作用:
doThis(alert);
但如果我这样做,我会收到错误:
doThis(window.location.replace);
未捕获的TypeError:非法调用
我正在为AJAX调用构建一个包装器,我需要支持alert
,自定义函数以及window.location.replace
等函数。我究竟做错了什么?
答案 0 :(得分:5)
当您将函数存储在与预期不同的上下文中时,它将无法再访问之前可以访问的属性。例如:
var myObj = {
foo: "foo",
alert: function(){
alert(this.foo);
}
}
myObj.alert(); // "foo"
var a = myObj.alert;
a(); // undefined.
当执行alert函数作为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();});
答案 1 :(得分:2)
您可以使用.bind
doThis(window.location.replace.bind(window.location));
答案 2 :(得分:2)
你可以尝试
doThis(function(x) {
window.location.replace(x);
});
或
doThis(window.location.replace.bind(window.location));
答案 3 :(得分:-1)
var myObj = {
foo: "foo",
alert: function(){
return alert(this.foo);
}
}
var a = myObj.alert(); // "foo"