摘要:注意的是,在語(yǔ)法中新增的聲明方式,并不支持這種變量提升強(qiáng)行使用會(huì)拋出錯(cuò)誤函數(shù)提升對(duì)于函數(shù)提升,只用函數(shù)的聲明被提升,表達(dá)式則不會(huì)被提升函數(shù)聲明函數(shù)表達(dá)式表達(dá)式定義的函數(shù),稱(chēng)為匿名函數(shù)。匿名函數(shù)沒(méi)有函數(shù)提升。
Variable hoisting變量提升是js比較有特點(diǎn)的地方,它允許你先使用變量,在其后面再進(jìn)行變量聲明,不會(huì)拋出 Uncaught ReferenceError異常。雖然變量被提升到前面,但是它的默認(rèn)值則是undefind,在引用的時(shí)候也使用這個(gè)值,知道在其面后進(jìn)行賦值,在使用時(shí)候即為所贖的值。
舉個(gè)例子:
console.log(x) //如果后面不定義x 則拋出"ReferenceError: x is not defined //如果后面對(duì)x定義 則打印出undefined var x = 2 var abc = "abcd"; (function(){ console.log(abc); //undefined var abc = "1234"; console.log(abc); //"1234" })() //上面代碼可以這樣翻譯 var x; console.log(x)//undefined var x = 2 var abc = "abcd"; (function(){ var abc; console.log(abc); //undefined var abc = "1234"; console.log(abc); //"1234" })()
基于這個(gè)原因,在平時(shí)編寫(xiě)代碼時(shí)候,盡量把變量聲明放到代碼塊最頂層位置,可以使代碼結(jié)構(gòu)清晰。
注意的是,在ES6語(yǔ)法中新增的let or const 聲明方式,并不支持這種變量提升,強(qiáng)行使用會(huì)拋出錯(cuò)誤ReferenceError
對(duì)于函數(shù)提升,只用函數(shù)的聲明被提升,表達(dá)式則不會(huì)被提升
/* 函數(shù)聲明 */ foo(); // "bar" function foo() { console.log("bar"); } /* 函數(shù)表達(dá)式 表達(dá)式定義的函數(shù),稱(chēng)為匿名函數(shù)。匿名函數(shù)沒(méi)有函數(shù)提升。*/ baz(); // TypeError: baz is not a function //此時(shí)的"baz"相當(dāng)于一個(gè)聲明的變量,類(lèi)型為undefined。 由于baz只是相當(dāng)于一個(gè)變量,因此瀏覽器認(rèn)為"baz()"不是一個(gè)函數(shù)。 var baz = function() { console.log("bar2"); };
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/50977.html
摘要:但是碰到聲明提升,這種想法就會(huì)被打破。聲明一個(gè)函數(shù)進(jìn)行相應(yīng)的操作,會(huì)得到函數(shù)聲明提升的結(jié)果。由此可以發(fā)現(xiàn)變量和函數(shù)的聲明都會(huì)被提升在其他代碼的前面執(zhí)行。一個(gè)普通塊內(nèi)部的函數(shù)聲明通常會(huì)被提升到所在的作用域的頂部。的創(chuàng)建初始化和賦值均會(huì)被提升。 Javascript聲明提升 在分析聲明提升之前,我認(rèn)為有必要知道的兩點(diǎn): 一、引擎查詢(xún)變量的兩種方式 引擎查詢(xún)變量的方式可以分為L(zhǎng)HS和RHS兩...
摘要:函數(shù)和變量相比,會(huì)被優(yōu)先提升。這意味著函數(shù)會(huì)被提升到更靠前的位置。僅提升聲明,而不提升初始化。 JavaScript 函數(shù)高級(jí)——執(zhí)行上下文與執(zhí)行上下文棧(圖解+典型實(shí)例分析) 變量提升與函數(shù)提升 變量聲明提升 通過(guò) var 定義(聲明)的變量,在定義語(yǔ)句之前就可以訪(fǎng)問(wèn)到 值:undefined /* 面試題 : 輸出 undefined */ var a = 3 ...
摘要:函數(shù)提升在里有兩種方式創(chuàng)建函數(shù),通過(guò)函數(shù)聲明和函數(shù)表達(dá)式。函數(shù)聲明用指定的參數(shù)來(lái)定義函數(shù)。提示不要在中進(jìn)行函數(shù)聲明。問(wèn)題輸出兩個(gè)都是用函數(shù)聲明的函數(shù),將被提升到的局部作用域頂端。函數(shù)本身將作為函數(shù)聲明在全局范圍內(nèi)提升。 作者關(guān)于提升的話(huà)題,總共有兩篇。(后來(lái)又有一個(gè)討論篇),再次搬過(guò)來(lái)。水平有限,如果翻譯的不準(zhǔn)確請(qǐng)包涵,并去看原文。下面開(kāi)始: 這是我之前的關(guān)于提升的文章,標(biāo)題為《用le...
摘要:輸出的結(jié)果為輸出的結(jié)果為提升后輸出的結(jié)果為重新定義了變量輸出的結(jié)果為如果定義了相同的函數(shù)變量聲明,后定義的聲明會(huì)覆蓋掉先前的聲明,看如下代碼輸出練習(xí)的值是多少的值是多少第二題的解析請(qǐng)看這里參考資料文章文章中文版鏈接文章推薦文章變量提升 JavaScript 變量聲明提升 原文鏈接 一個(gè)小例子 先來(lái)看個(gè)例子: console.log(a); // undefined var a =...
摘要:不同的是函數(shù)體并不會(huì)再被提升至函數(shù)作用域頭部,而僅會(huì)被提升到塊級(jí)作用域頭部避免全局變量在計(jì)算機(jī)編程中,全局變量指的是在所有作用域中都能訪(fǎng)問(wèn)的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開(kāi)發(fā):語(yǔ)法基礎(chǔ)與實(shí)踐技巧系列文章。本文詳細(xì)討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對(duì)象以及如何避免創(chuàng)建...
摘要:代碼在執(zhí)行時(shí)并不完全是由上到下一行一行執(zhí)行的,由此產(chǎn)生了一個(gè)提升的問(wèn)題。第二個(gè)賦值聲明會(huì)被留在原地等待執(zhí)行階段??梢缘弥瘮?shù)聲明提升的優(yōu)先權(quán)大于普通變量聲明。 JavaScript代碼在執(zhí)行時(shí)并不完全是由上到下一行一行執(zhí)行的,由此產(chǎn)生了一個(gè)提升的問(wèn)題。 什么是提升 可以簡(jiǎn)單理解為:聲明(變量和函數(shù))都會(huì)被移動(dòng)到各自作用域的最頂端,這個(gè)過(guò)程被稱(chēng)為提升。 具體例子看提升 下面兩個(gè)例子a會(huì)l...
閱讀 2023·2019-08-30 15:52
閱讀 2982·2019-08-29 16:09
閱讀 1328·2019-08-28 18:30
閱讀 2457·2019-08-26 12:24
閱讀 1099·2019-08-26 12:12
閱讀 2278·2019-08-26 10:45
閱讀 572·2019-08-23 17:52
閱讀 828·2019-08-23 16:03