2017-02-15 80 views
2

在JavaScript中,我不明白下面

var y = 1; 
 
if (function f(){}) { 
 
    y += typeof f; 
 
} 
 
console.log(y);

代碼的輸出我預計產出將是「1function」。但是,實際輸出是'1未定義'。據我所知,函數聲明是懸而未決的,如果聲明可以訪問函數f。但是爲什麼它打印出未定義的函數還沒有被聲明?

+4

這不是條件中的函數聲明,它是一個命名的函數表達式。函數表達式的名稱僅在函數內部可用,因此示例中的「f」在「if」塊中完全沒有定義。如果您嘗試記錄'y',則會出現錯誤。 – Teemu

+0

另請參見http://stackoverflow.com/questions/10069204/function-declarations-inside-if-else-statements –

+0

啊...一個錯字,應該是「如果你試圖登錄'F' ... 「 當然。 – Teemu

回答

2

你不能在一個條件內聲明一個函數。只要你把函數聲明外,if語句之前,你可以在條件中使用它,其結果將是您預期的那樣:

var y = 1; 
 
function f(){} 
 
    if (f) { 
 
    y += typeof f; 
 
    } 
 
    console.log(y);

編輯:嗯,原來你實際上可以(有點*),但不符合所選的符號。這將工作:

var y = 1, f; 
 
    if (f = function(){}) { 
 
    y += typeof f; 
 
    } 
 
    console.log(y);

*爲Teemu在評論中指出,這是不是一個真正的函數聲明,而是一個匿名函數的引用而被分配給變量f

+1

雖然在第二個片段中還有一個條件中的函數表達式,但這次它是匿名的。你真的不能在需要表達式的地方聲明一個函數。 – Teemu

+0

良好的捕獲 - 做了一個編輯,以進一步解釋這一點。更好? :) – Connum

+0

@downvoter:可能會考慮細節? – Connum