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

首頁 > 開發(fā) > JS > 正文

詳解javascript 變量提升(Hoisting)

2024-05-06 16:48:57
字體:
供稿:網(wǎng)友

簡(jiǎn)介

變量提升”意味著變量和函數(shù)的聲明會(huì)在物理層面移動(dòng)到代碼的最前面,但這么說并不準(zhǔn)確。 

實(shí)際上變量和函數(shù)聲明在代碼里的位置是不會(huì)動(dòng)的,而是在編譯階段被放入內(nèi)存中。

聲明變量的方法

var、let、const 

不用以上關(guān)鍵字直接賦值的變量會(huì)掛載與windows環(huán)境下;

let a=9const a=1var a=6c=5

聲明函數(shù)的方法

javascript中聲明函數(shù)的方法有兩種:函數(shù)聲明式和函數(shù)表達(dá)式。

//函數(shù)聲明function say(){  console.log('hello') }//函數(shù)表達(dá)式var say=function (){  console.log('hello') }

提升的好處

JavaScript 在執(zhí)行任何代碼段之前,將函數(shù)聲明放入內(nèi)存中的優(yōu)點(diǎn)之一是,這允許你可以在在聲明該函數(shù)之前使用一個(gè)函數(shù)。

/*** 正確的方式:先聲明函數(shù),再調(diào)用函數(shù) (最佳實(shí)踐)*/function catName(name) {  console.log("我的貓名叫 " + name);}catName("Tigger");/*以上代碼的執(zhí)行結(jié)果是: "我的貓名叫 Tigger"*//*** 不推薦的方式:先調(diào)用函數(shù),再聲明函數(shù) */catName("Chloe");function catName(name) {  console.log("我的貓名叫 " + name);}/*代碼執(zhí)行的結(jié)果是: "我的貓名叫 Chloe"*/

提升規(guī)則

  • var 聲明的變量,提升時(shí)只聲明,不賦值,默認(rèn)為undefined;不用關(guān)鍵字直接賦值的變量不存在提升(demo1)
  • 函數(shù)提升會(huì)連帶函數(shù)體一起提升,不執(zhí)行;(deom2)
  • 預(yù)解析的順序是從上到下;(demo4)
  • 函數(shù)的優(yōu)先級(jí)高于變量,函數(shù)聲明提前到當(dāng)前作用域最頂端;(deom3)
  • 變量重名,提升時(shí)不會(huì)重復(fù)定義;在執(zhí)行階段后面賦值的會(huì)覆蓋上面的賦值;(demo4)
  • 函數(shù)重名,提升時(shí)后面的會(huì)覆蓋前面;(demo5)
  • 函數(shù)和變量重名,提升函數(shù),不會(huì)重復(fù)定義,變量不會(huì)覆蓋函數(shù);在執(zhí)行階段后面賦值的會(huì)覆蓋上面的賦值;(demo8)
  • 用函數(shù)表達(dá)式聲明函數(shù),會(huì)按照聲明變量規(guī)則進(jìn)行提升;(deom6)
  • 函數(shù)執(zhí)行時(shí),函數(shù)內(nèi)部的變量聲明和函數(shù)聲明也按照以上規(guī)則進(jìn)行提升;(deom7)
  • let、const不存在提升;(demo9、demo10)
/**demo1**/console.log('a=',a) //a=undefinedconsole.log('b=',b) // Uncaught ReferenceError: b is not definedvar a=1b=6/**deom2**/console.log('a=',a) // a=function a() {console.log("func a()")}function a() {console.log("func a()")}/**deom3**/console.log('a=',a) // a=function a() {console.log("fun a")}var a=3var a=4function a(){console.log("fun a")}var a=5var a=6console.log("a=",a) // a=6 /**deom4**/console.log('a=',a) // a=undefinedvar a =2console.log('a=',a) //var a =3var a =4console.log('a=',a) // a=4console.log('b=',b) //b= undefinedvar b='b1'/**deom5**/console.log('a=',a) // a=function a() {console.log("a2")}function a(){console.log("a1")}function a(){console.log("a2")}console.log('a=',a) // a=function a() {console.log("a2")}/**deom6**/console.log('a=',a) // a=undefinedvar a=function(){console.log('a1')}var a=3var a=4var a=5console.log(a)var a=function(){console.log('a2')}console.log('a=',a) // a= ƒ (){console.log('a2')}/**deom7**/console.log('b=',b)var a=3function b(i){  console.log('a=',a)  var a=4  function a(){    console.log('fun a')  }  console.log('a=',a)}b()/**demo8**/console.log('a=',a) //a= function a(){ console.log('fun a')}var a=2function a(){  console.log('fun a')}console.log('a=',a) // a=2var a=3var a=4var a=5console.log('a=',a) // a=5/**demo9**/console.log('a=',a) //Uncaught ReferenceError: a is not definedlet a=4/****/<!--demo10-->console.log('b=',b) // Uncaught ReferenceError: b is not definedconst b=5

參考資料

MDN

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临沂市| 太仓市| 安泽县| 安阳市| 宝兴县| 都匀市| 木兰县| 杭锦后旗| 铁力市| 盐源县| 成安县| 本溪市| 黄浦区| 霍林郭勒市| 孙吴县| 绩溪县| 固镇县| 兴国县| 永修县| 库伦旗| 天水市| 甘谷县| 雅安市| 临城县| 乃东县| 寿宁县| 辉县市| 钟祥市| 日喀则市| 西丰县| 丰县| 韶山市| 泰顺县| 璧山县| 资中县| 家居| 合阳县| 青岛市| 灵武市| 四子王旗| 定南县|