Javascript未捕获类型错误:非法调用

Javascript未捕获类型错误:非法调用,javascript,Javascript,可能重复: 当我将方法设置为console.log时,有人能告诉我为什么这不起作用吗 var met = "console.log"; var msg = "HELLO WORLD"; var n = met.split("."); var f = this; $.each(n, function(k, v){ f = f[v]; }); f(msg); 当我尝试使用alert时,这似乎是有效的,因为console的日志函数被分配给f变量,但当执行时,它不再引用console范围。在

可能重复:

当我将方法设置为
console.log
时,有人能告诉我为什么这不起作用吗

var met = "console.log";
var msg = "HELLO WORLD";
var n = met.split(".");
var f = this;
$.each(n, function(k, v){
    f = f[v];
});
f(msg);

当我尝试使用
alert

时,这似乎是有效的,因为console的日志函数被分配给
f
变量,但当执行时,它不再引用console范围。在处理回调或传递函数时,Javascript作用域可能会变得棘手

就@Murali的评论而言,一些浏览器实现console.log方法的方式与其他浏览器不同

作为一个实验,试着运行此代码,看看它是否有效:

var met = "console.log";
var msg = "HELLO WORLD";
var n = met.split(".");
n[1].call(n[0], msg);
使用
.call
方法可以执行函数并声明其“作用域”。如果这对您有效,那么重构循环场景应该很容易。

解决了这个问题

var met = "console.log";
var msg = "HELLO WORLD";
var n = met.split(".");
var tail = n.pop();
var f = this;
$.each(n, function(k, v){
    f = f[v];
});
var func = function(){ f[tail].apply(f, arguments); }
func(msg);
在Chrome、Firefox、Opera和Safari上进行了测试。在IE9上似乎不起作用

我是从@muistooshort on那里得到这些想法的
同样,从@jasonbunting on

上,您的代码可以完美运行。。!我可以运行它