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