国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 浏阳市| 民乐县| 呼图壁县| 云霄县| 清河县| 永定县| 正定县| 河津市| 麻江县| 松滋市| 越西县| 祁东县| 兰州市| 宜君县| 容城县| 永新县| 山西省| 安西县| 兴隆县| 晴隆县| 宝鸡市| 如东县| 吴江市| 潞西市| 凤冈县| 宜春市| 沧源| 安新县| 涡阳县| 高淳县| 革吉县| 马边| 陵川县| 台山市| 卢龙县| 裕民县| 嘉善县| 扶余县| 荔浦县| 麻城市| 天长市|