摘要:同名變量和函數(shù),函數(shù)會(huì)提升到最前邊,變量其次,為什么不那為什么結(jié)果不是我們?nèi)斯?zhí)行的呢原因是變量會(huì)被忽略,是的是忽略。。。同名變量解析完順序是這樣的忽略同名變量,聲明會(huì)被提升,后邊會(huì)忽略。
//先從一個(gè)面試題說起 console.log(a) if (a) { var a = 1; console.log(a) } function a() { console.log(this); } console.log(a); a()
下面我們針對(duì)這個(gè)栗子解析一下
我們知道變量和很熟定義都會(huì)提升到作用域最前邊
唯一需要確認(rèn)的是變量和函數(shù)的先后順序
我們預(yù)想 函數(shù)是用第一公民會(huì)不會(huì)提升到最前邊呢?
//如果是解析完順序是這樣的 function a() { console.log(this); } var a; console.log(a) if (a) { a = 1; console.log(a) } console.log(a); a()
按照我們預(yù)想的解析結(jié)果應(yīng)該是
// undefined
// undefined
// 報(bào)錯(cuò)
理由 函數(shù)在上var在下,第一個(gè)console時(shí)a未賦值,其結(jié)果是undefined,if為false 只剩最后一個(gè)console也是undefined 最后a is not a function.
不過結(jié)果是
我機(jī)智的認(rèn)為 預(yù)想錯(cuò)了?
//再次測(cè)試 var a; function a() { console.log(this); } console.log(a) if (a) { a = 1; console.log(a) } console.log(a); a()
這樣?對(duì)比一下結(jié)果
人工解析結(jié)果 :
1、a()
2、1
3、1
4、a() 報(bào)錯(cuò)
瀏覽器執(zhí)行結(jié)果:
沒毛病!
看到這里一切完美,不過我還是重新搜索了一些高質(zhì)量文章,發(fā)現(xiàn)我錯(cuò)了,雖然執(zhí)行結(jié)果是對(duì)的,不過瀏覽器和人工解析還是不一樣的,和我們最開始預(yù)想的一樣,函數(shù)優(yōu)先。
既然標(biāo)題說到了 變量 和 函數(shù),我們就一塊來說說
//簡(jiǎn)單的栗子 function a(){ console.log(a) } console.log(a) var a = 1 a()
首先上邊已經(jīng)說到我們預(yù)想和認(rèn)為的是錯(cuò)的。
正確解析順序是這樣的
function a(){ console.log(a) } var a; console.log(a) a = 1 a()
但是,這個(gè)但是很重要瀏覽器執(zhí)行結(jié)果是:
why?這就要講講我所了解到的原理。
function a(){ console.log(a) } var a;//忽略 console.log(a) //打印函數(shù)本身 a = 1 a()// a is not a function
完美!
還有呢?是的還有同名變量是怎樣的順序,同名函數(shù)是怎樣的順序。
console.log(a) var a = 1 console.log(a) var a = 2 console.log(a) //解析完順序是這樣的 var a; var a; //忽略 console.log(a) // undfined a = 1 console.log(a) //1 a = 2 console.log(a)//2
*同名變量,聲明會(huì)被提升,后邊會(huì)忽略。
function a(){console.log(1)} console.log(a) function a(){console.log(2)} console.log(a) a() //解析完 function a(){console.log(1)} function a(){console.log(2)} console.log(a) console.log(a) a()
執(zhí)行結(jié)果
我想你已經(jīng)猜到了,同名函數(shù)會(huì)被覆蓋。
終于完了!
您的點(diǎn)贊是我繼續(xù)下去的動(dòng)力,謝謝!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/100823.html
摘要:輸出的結(jié)果為輸出的結(jié)果為提升后輸出的結(jié)果為重新定義了變量輸出的結(jié)果為如果定義了相同的函數(shù)變量聲明,后定義的聲明會(huì)覆蓋掉先前的聲明,看如下代碼輸出練習(xí)的值是多少的值是多少第二題的解析請(qǐng)看這里參考資料文章文章中文版鏈接文章推薦文章變量提升 JavaScript 變量聲明提升 原文鏈接 一個(gè)小例子 先來看個(gè)例子: console.log(a); // undefined var a =...
摘要:但是碰到聲明提升,這種想法就會(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): 一、引擎查詢變量的兩種方式 引擎查詢變量的方式可以分為L(zhǎng)HS和RHS兩...
摘要:函數(shù)和變量相比,會(huì)被優(yōu)先提升。這意味著函數(shù)會(huì)被提升到更靠前的位置。僅提升聲明,而不提升初始化。 JavaScript 函數(shù)高級(jí)——執(zhí)行上下文與執(zhí)行上下文棧(圖解+典型實(shí)例分析) 變量提升與函數(shù)提升 變量聲明提升 通過 var 定義(聲明)的變量,在定義語(yǔ)句之前就可以訪問到 值:undefined /* 面試題 : 輸出 undefined */ var a = 3 ...
摘要:不同的是函數(shù)體并不會(huì)再被提升至函數(shù)作用域頭部,而僅會(huì)被提升到塊級(jí)作用域頭部避免全局變量在計(jì)算機(jī)編程中,全局變量指的是在所有作用域中都能訪問的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語(yǔ)法基礎(chǔ)與實(shí)踐技巧系列文章。本文詳細(xì)討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對(duì)象以及如何避免創(chuàng)建...
摘要:發(fā)布自的博客,歡迎大家轉(zhuǎn)載,但是要注意注明出處。另外,該文章收納在的個(gè)人的知識(shí)整理倉(cāng)庫(kù),歡迎投稿介紹變量提升是人們對(duì)執(zhí)行上下文工作方式的一種認(rèn)識(shí),并不是官方給出的改變從字面上理解,變量提升的意思是變量和函數(shù)的聲明會(huì)在物理層移動(dòng)到作用域的最前 發(fā)布自Kindem的博客,歡迎大家轉(zhuǎn)載,但是要注意注明出處。另外,該文章收納在Kindem的個(gè)人的 IT 知識(shí)整理倉(cāng)庫(kù),歡迎 Star、Fork、...
摘要:函數(shù)提升在里有兩種方式創(chuàng)建函數(shù),通過函數(shù)聲明和函數(shù)表達(dá)式。函數(shù)聲明用指定的參數(shù)來定義函數(shù)。提示不要在中進(jìn)行函數(shù)聲明。問題輸出兩個(gè)都是用函數(shù)聲明的函數(shù),將被提升到的局部作用域頂端。函數(shù)本身將作為函數(shù)聲明在全局范圍內(nèi)提升。 作者關(guān)于提升的話題,總共有兩篇。(后來又有一個(gè)討論篇),再次搬過來。水平有限,如果翻譯的不準(zhǔn)確請(qǐng)包涵,并去看原文。下面開始: 這是我之前的關(guān)于提升的文章,標(biāo)題為《用le...
閱讀 779·2021-10-27 14:15
閱讀 1258·2021-10-15 09:42
閱讀 2796·2019-08-30 15:53
閱讀 1332·2019-08-23 17:02
閱讀 3016·2019-08-23 16:23
閱讀 3244·2019-08-23 15:57
閱讀 3533·2019-08-23 14:39
閱讀 571·2019-08-23 14:35