使用javascript进行非法调用?

时间:2013-11-26 22:59:53

标签: javascript

我有一个功能:

var doThis = function(callback){
     callback('google.com');
}

如果我这样做,它会起作用:

doThis(alert);

但如果我这样做,我会收到错误:

doThis(window.location.replace);
  

未捕获的TypeError:非法调用

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

小提琴:http://jsfiddle.net/32LJf/1/

4 个答案:

答案 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();});

http://jsfiddle.net/rhdZa/1/

答案 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"