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上,您的代码可以完美运行。。!我可以运行它