一千萬個為什麽

搜索

為什麽JavaScript函數別名不起作用?

我有一些Firebug控制臺函數調用,我想在Firebug未啟用時禁用,例如控制臺未定義。這適用於IE6和FF3,但不適用於Chrome:

var log;

if(console){
  log = console.log;
}else{
  log = function(){ return; }
}

我在Chrome中收到“未捕獲的TypeError:非法調用”= /

我讀到了此處的問題,您必須應用上下文,這對我來說是一種新的......我似乎無法想象如何在所有瀏覽器中完成上述操作......

最佳答案

是的,你應該堅持上下文:

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; }
}

發生的事情是在調用函數時隱式設置上下文( this 值),例如:

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

obj.method() === obj;//true

在這種情況下,您正在調用一個被定義為對象屬性的函數,當調用該函數時, this 值被設置為該對象。

現在,如您的示例中所示,如果將該方法的引用復制到變量:

var method = obj.method;
method() === window;//global object

如您所見, this 值指的是全局對象。

因此,為了避免這種隱式行為,您可以使用 <�顯式設置上下文。代碼>調用apply 功能。

轉載註明原文: 為什麽JavaScript函數別名不起作用?