0

可能重复:
Chrome 在调用 log 时无法识别 console.log

谁能告诉我为什么当我将方法设置为时这不起作用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

4

2 回答 2

1

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

至于@Murali 的评论,它的工作原理,一些浏览器实现console.log 方法的方式与其他浏览器不同。

作为一个实验,尝试运行这段代码,看看它是否有效:

var met = "console.log";
var msg = "HELLO WORLD";
var n = met.split(".");
n[1].call(n[0], msg);

使用该.call方法可以让您执行一个函数并声明其范围。如果这对您有用,那么重构您的循环场景应该很容易。

于 2012-12-06T06:26:11.563 回答
0

解决了。

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 上不起作用。

我从Link上 的 @muistooshort 和Link上的 @jasonbunting 那里得到了想法

于 2012-12-06T07:20:54.600 回答