国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

全面了解函數(shù)聲明與函數(shù)表達(dá)式、變量提升

2019-11-20 09:16:43
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

函數(shù)的聲明方式

在定義一個(gè)函數(shù)的時(shí)候通常有兩種聲明方式:

foo(){};   // 函數(shù)聲明var foo = function(){};  // 函數(shù)表達(dá)式

不同之處

1、函數(shù)表達(dá)式后面加括號(hào)可以直接執(zhí)行
2、函數(shù)聲明會(huì)提前預(yù)解析

預(yù)解析

讓我們先看一個(gè)例子:

foo();     // 函數(shù)聲明foo_later();   // foo_later is not a functionfunction foo(){ console.log('函數(shù)聲明'); }var foo_later = function(){ console.log('函數(shù)表達(dá)式'); }

可以看到,函數(shù)聲明foo被預(yù)解析了,它可以在其自身代碼之前執(zhí)行;而函數(shù)表達(dá)式foo_later則不能。要解決這個(gè)問(wèn)題,我們先要弄清楚JavaScript解析器的工作機(jī)制。

變量提升(hoist)

JavaScript解析器會(huì)在自身作用域內(nèi)將變量和函數(shù)聲明提前(hoist),也就是說(shuō),上面的例子其實(shí)被解析器理解解析成了以下形式:

function foo(){ console.log('函數(shù)聲明'); }  // 函數(shù)聲明全部被提前var foo_later;   // 函數(shù)表達(dá)式(變量聲明)僅將變量提前,賦值操作沒(méi)有被提前foo();       foo_later();   foo_later = function(){ console.log('函數(shù)表達(dá)式'); }

這樣也就可以解釋?zhuān)瑸槭裁丛诤瘮?shù)表達(dá)式之前調(diào)用函數(shù),會(huì)返回錯(cuò)誤了,因?yàn)樗€沒(méi)有被賦值,只是一個(gè)未定義變量,當(dāng)然無(wú)法被執(zhí)行。

同樣的,我們也可以試著猜測(cè)下面這段代碼的輸出結(jié)果:

console.log(declaredLater);  var declaredLater = "Now it's defined!";console.log(declaredLater);  

該段代碼可以被解析成一下形式:

 

var declaredLater;     console.log(declaredLater);  // undefineddeclaredLater = "Now it's defined!";console.log(declaredLater);  // Now it's defined!

 變量聲明被提到最前(所以不會(huì)報(bào)出變量不存在的錯(cuò)誤),但賦值沒(méi)有被提前,所以第一次的輸出結(jié)果是undefined。

需要注意的是

由于函數(shù)聲明會(huì)被預(yù)解析,所以不要使用此種方法來(lái)聲明不同函數(shù)。嘗試猜想下面例子的輸出結(jié)果:

if(true){ function aaa(){  alert('1'); } }else{ function aaa(){  alert('2'); }}aaa();

與我們預(yù)想的不同,該段代碼彈出的是“2”.這是因?yàn)閮蓚€(gè)函數(shù)聲明在if語(yǔ)句被執(zhí)行之前就被預(yù)解析了,所以if語(yǔ)句根本沒(méi)有用,調(diào)用aaa()的時(shí)候直接執(zhí)行了下面的函數(shù)。

總結(jié)

通過(guò)上面的講解可以總結(jié)如下:

•變量的聲明被提前到作用域頂部,賦值保留在原地

•函數(shù)聲明整個(gè)“被提前”

•函數(shù)作為值賦給變量時(shí)只有變量“被提前”了,函數(shù)沒(méi)有“被提前”

通過(guò)練習(xí)上面的實(shí)例自己多感受一下。另外,作為最佳實(shí)踐:變量聲明一定要放在作用域/函數(shù)的最上方(JavaScript 只有函數(shù)作用域!)。

以上這篇全面了解函數(shù)聲明與函數(shù)表達(dá)式、變量提升就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 丽水市| 湘乡市| 准格尔旗| 玉门市| 兴安县| 通许县| 东光县| 台北市| 安丘市| 旬阳县| 延吉市| 渭源县| 台江县| 吴忠市| 玉树县| 洛川县| 武威市| 石河子市| 涞水县| 镶黄旗| 寿阳县| 泰和县| 福贡县| 孟村| 全椒县| 金昌市| 巫山县| 榕江县| 治县。| 广州市| 始兴县| 苏尼特左旗| 仪征市| 滕州市| 七台河市| 尖扎县| 合水县| 安顺市| 靖边县| 肃宁县| 社会|