2013-11-03 49 views
1

使用首先檢查它是否已被定義的函數會在任何Webkit瀏覽器下出現問題。 有時我使用js模塊A中的函數,而在另一個應用程序中,我希望使用與模塊B具有相同名稱(但代碼略有不同)的相同函數。 我通過typeof運算符來解決此問題,以檢查它是否「未定義」。 下面的例子(爲了清晰起見,在一個文件中)顯示了我所做的。WEBKIT:if(0)中定義的javascript函數調用

<!DOCTYPE html> 
<html> 
<head> 
<title>Javascript function definition test</title> 
<script type="text/javascript"> 

// actually in module A.js 
function foo() 
{ 
    alert("This is the first function."); 
} 

// actually in module B.js 

if (typeof(foo)=="undefined") { 
function foo() 
{ 
    alert("This is the second function when foo() is undefined."); 
} 

} 
// This definition SHOULD be ignored in all cases but Webkit does run this despite the if (false) !! 

if (false) { 
function foo() 
{ 
    alert("This is the third function when foo() is defined within if (false)."); 
} 

} 

</script> 
</head> 
<body> 
<script type="text/javascript"> 
foo(); 
</script> 
</body> 
</html> 

我發現,在Chrome瀏覽器(Android和OSX),船Android瀏覽器,Safari瀏覽器(OSX)始終儘管它如果(假)條件之間不能進行最後定義的函數被調用。 當我們刪除這個時,儘管函數在前面定義過,但typeof「undefined」之間的第二個定義被調用。

在Firefox(OSX,Android)下,它正確調用第一個函數。

這是Webkit引擎中的錯誤還是我忽略了一些東西?

回答

1

這是一種僥倖,它在一些瀏覽器中工作,並沒有因爲你的想法。

函數定義是「懸掛」的,所以函數在其範圍內可用,而不是定義的位置。

例如,這是合法的

a(); 
function a() { 
} 

因爲在評估中,函數的定義提升到頂部,併成爲

function a() { 
} 
a(); 

相反,這樣做:

if(window.foo === undefined) { 
    window.foo = function() { 
     alert("This is the second function when foo() is undefined."); 
    } 
} 
+0

這是很簡單,簡潔,謝謝。 –

0

指令函數名稱()意味着您正在窗口範圍內聲明函數。 您需要將您的功能鏈接到某個變量。

var myFunc=function(){ alert(1);}; 
if (true){ 
    myFunc=function(){alert(2);} 
} 
if (false){ 
    myFunc=function(){alert(3);} 
} 
myFunc(); 

警報2將觸發。

1

正如Paul Draper的回覆所述,函數定義被提升到範圍的頂部。

你的問題可以通過固定的聲明功能是這樣的:

var foo; 

foo = function() 
{ 
    alert("This is the first function."); 
} 

// actually in module B.js 

if (typeof(foo)=="undefined") { 
    foo = function() 
    { 
    alert("This is the second function when foo() is undefined."); 
    } 
} 
// This definition SHOULD be ignored in all cases but Webkit does run this despite the if (false) !! 

if (false) { 
    foo = function() 
    { 
    alert("This is the third function when foo() is defined within if (false)."); 
    } 
}