var y = 1;
if (function f(){}) {
y += typeof f;
}
console.log(y);
代碼的輸出我預計產出將是「1function」。但是,實際輸出是'1未定義'。據我所知,函數聲明是懸而未決的,如果聲明可以訪問函數f。但是爲什麼它打印出未定義的函數還沒有被聲明?
var y = 1;
if (function f(){}) {
y += typeof f;
}
console.log(y);
代碼的輸出我預計產出將是「1function」。但是,實際輸出是'1未定義'。據我所知,函數聲明是懸而未決的,如果聲明可以訪問函數f。但是爲什麼它打印出未定義的函數還沒有被聲明?
你不能在一個條件內聲明一個函數。只要你把函數聲明外,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
。
這不是條件中的函數聲明,它是一個命名的函數表達式。函數表達式的名稱僅在函數內部可用,因此示例中的「f」在「if」塊中完全沒有定義。如果您嘗試記錄'y',則會出現錯誤。 – Teemu
另請參見http://stackoverflow.com/questions/10069204/function-declarations-inside-if-else-statements –
啊...一個錯字,應該是「如果你試圖登錄'F' ... 「 當然。 – Teemu