使用javascript进行非法调用?

SB2*_*055 4 javascript

我有一个功能:

var doThis = function(callback){
     callback('google.com');
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,它的工作原理:

doThis(alert);
Run Code Online (Sandbox Code Playgroud)

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

doThis(window.location.replace);
Run Code Online (Sandbox Code Playgroud)

未捕获的TypeError:非法调用

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

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

use*_*654 5

将函数存储在与预期不同的上下文中时,它将无法再访问先前可以访问的属性.例如:

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

myObj.alert(); // "foo"
var a = myObj.alert;
a(); // undefined.
Run Code Online (Sandbox Code Playgroud)

当作为myObj的属性执行alert函数时,它可以访问this.foo,但是,当您将该函数存储在其他位置时,它将无法再访问它.要解决它,请存储一个执行该函数的匿名函数.

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

myObj.alert(); // "foo"
var a = function(){myObj.alert();}
a(); // "foo".
Run Code Online (Sandbox Code Playgroud)

并应用于您的代码:

doThis(function(){window.location.replace();});
Run Code Online (Sandbox Code Playgroud)

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