使用javascript多年,寫過無數(shù)函數(shù),今天卻才真正弄明白兩種函數(shù)定義的區(qū)別,真是悲劇,寫下這個隨筆, 以時刻提醒自己要打好基礎(chǔ) , 一大把年紀(jì)了, 不能繼續(xù)懵懵懂懂了。
通常我們會看到以下兩種定義函數(shù)的方式:
// 表達(dá)式定義
var fnx=function(str)
{
console.log(str+ ' from fnx');
};
兩種方式都創(chuàng)建了新的函數(shù)對象, 但函數(shù)聲明語句的函數(shù)名是一個變量名, 變量指向函數(shù)對象, 和通過var聲明變量一樣,函數(shù)定義語句中的函數(shù)被顯示地提前到了腳本或函數(shù)的頂部, 因此它們在整個腳本和函數(shù)內(nèi)都是可見的,但是使用var 表達(dá)式定義函數(shù), 只有變量聲明提前了,變量初始化代碼仍然在原來的位置, 用函數(shù)語句創(chuàng)建的函數(shù), 函數(shù)名稱和函數(shù)體均被提前,所以我們可以在聲明它之前就使用它。
代碼例子如下:
console.log(typeof(fnx)); // undefined
if(fnx)
fnx('abc'); // will not execute
else
console.log('fnx is undefined'); // fnx is undefined
// 函數(shù)語句
function fn(str)
{
console.log(str);
};
// 表達(dá)式定義
var fnx=function(str)
{
console.log(str+ ' from fnx');
};
新聞熱點(diǎn)
疑難解答