2016-04-20 73 views
0

只是覺得退出困惑一些測驗。兩個令人困惑的Javascript測驗

測驗一個

var x = 1; 
 
    if (function f(){}) { 
 
    x += typeof f; 
 
    } 
 
    alert(x);

答:

x的答案是 「1undefined」

困惑:

在if條件中真正發生了什麼「function f(){}」?

測驗兩個

(function(x){ 
 
    delete x; 
 
    return x; 
 
    })(1);

答案:

的輸出爲1。

混亂:

爲什麼刪除不起作用? 什麼時候「刪除」工作,什麼時候不工作?

回答

3

#1上的混淆點是該函數正在作爲函數表達式。該函數是真實的(因此它將if語句傳遞爲truthy),但它不是函數聲明,因此不會爲其創建任何外部參考f

這與將函數分配給變量時的概念相同:您正在創建函數表達式。

var g = function(){}; 

命名的函數表達式實際上並沒有改變:

var g = function f(){}; 
// it would still only be externally accessible as g, not f 

它只會被訪問的f從裏面的函數:

var g = function f(){ alert(f); }; 
g(); // will call the function, and from inside f will work 

爲了使f作爲函數聲明(而不是表達式),它必須在其當前範圍內自行定義,如下所示:

function f() {} 
// now we can reference it as f externally as a statement! 

的方式,即使只是一個字符,它反而成爲一種表達......

!function f() {} 
// now we can't :(

#2,很簡單:刪除是對象的屬性。如:

var obj = {}; 
obj.foo = 'bar'; 
delete obj.foo; 
alert(obj.hasOwnProperty('foo')); // <- false 
+0

非常感謝這些有用的信息! – Kelvin

5

由於任何功能都是正確的,您只需加入一個1字符串'undefined'即可。在第二種情況下,delete僅適用於對象屬性。

+0

感謝函中的解釋布爾值和刪除關鍵字 – Kelvin

0

f不等於f()你對一個未定義的變量使用typeof,它返回undefined,你追加到x的字符串。

正如前面的答案所述。刪除刪除對象屬性,它不會清除或銷燬變量。