【问题标题】:Javascript Uncaught TypeError: Illegal invocation [duplicate]Javascript Uncaught TypeError:非法调用[重复]
【发布时间】:2012-12-07 04:59:52
【问题描述】:

可能重复:
Chrome doesn’t recognize console.log when it’s called 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时,这似乎有效

【问题讨论】:

  • 您的代码完美运行..!我可以运行它

标签: javascript


【解决方案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 方法可以让你执行一个函数并声明它的作用域。如果这对你有用,那么重构你的循环场景应该很容易。

【讨论】:

    【解决方案2】:

    解决了。

    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 那里得到了Link 的想法 还有来自@jasonbunting 的Link

    【讨论】:

      猜你喜欢
      • 2018-12-02
      • 1970-01-01
      • 2014-05-04
      • 2016-12-07
      • 1970-01-01
      • 2015-10-18
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多