谁能告诉我为什么当我将方法设置为时这不起作用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.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
这是因为控制台的日志功能被分配给f
变量,但是在执行时它不再引用控制台范围。在处理回调或传递函数时,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 上不起作用。
我从Link上 的 @muistooshort 和Link上的 @jasonbunting 那里得到了想法