为什么JavaScript函数别名不起作用?

qod*_*nja 21 javascript firebug alias google-chrome function

我有一些Firebug控制台函数调用,我想在Firebug未启用时禁用,例如未定义控制台.这适用于IE6和FF3,但不适用于Chrome:

var log;

if(console){
  log = console.log;
}else{
  log = function(){ return; }
}
Run Code Online (Sandbox Code Playgroud)

我在Chrome中收到"未捕获的TypeError:非法调用"= /

我在这里读到了这个问题,你必须应用一个上下文,这对我来说是一种新的...我似乎无法想象如何在所有浏览器中完成上述操作......

CMS*_*CMS 27

是的,你应该坚持上下文:

var log;

if (window.console && typeof console.log === "function"){
  // use apply to preserve context and invocations with multiple arguments
  log = function () { console.log.apply(console, arguments); };
} else {
  log = function(){ return; }
}
Run Code Online (Sandbox Code Playgroud)

发生的事情是this在调用函数时隐式设置上下文(值),例如:

var obj = {
  method: function () { return this; }
};

obj.method() === obj; // true
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您正在调用一个被定义为对象属性的函数,当调用该函数时,该this值将设置为该对象.

现在,如您的示例中所示,如果将该方法的引用复制到变量:

var method = obj.method;
method() === window; // global object
Run Code Online (Sandbox Code Playgroud)

如您所见,该this值指的是全局对象.

因此,为了避免这种隐式行为,您可以使用callapply函数显式设置上下文.


Dzi*_*owy 6

在函数中包装函数(如console.log)的问题是它丢失了它的上下文,即它不会显示我们将"log"快捷方式放入的文件的正确行号.

相反,我建议这样的事情:

 window.log = ((window.console && window.console.log) ?
              console.log.bind(console) : 
              function(){});
Run Code Online (Sandbox Code Playgroud)

这适用于firebug和chrome dev工具,并且在没有可用的控制台时不会抛出错误.并且 - 最重要的是 - 显示正确的文件和行号.