<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在我們的印象中,當提到JavaScript
中的變數提升,我們想到的是“變數和函數的宣告在物理層面移動到程式碼的最前面“。當然這麼說不大準確,變數和函數宣告在程式碼裡的位置是不會變的,而是在編譯階段被放入記憶體中。
可是如果我問你:let 到底有沒有提升?如果有,var / let / function三者的變數提升一致嗎?此時你的答案是什麼?
接下來讓我們來探討這兩個問題,如有錯誤敬請指正。
對於let
是否存在提升這個問題,讓我們先來看以下這段程式碼:
a = "global"; (function() { console.log(a); // undefined, 而不是列印出global var a; }()); { console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization let a = 1; }
對於在函數作用域下列印出undefined
,我們應該不奇怪。但引起我注意的是在塊作用域下,丟擲參照錯誤的原因是在初始化之前找不到a
。那有沒有可能a
在建立過程被提升?而在我發現ES檔案中存在[var/let hoisting]
,這讓我有理由猜測let
存在提升,只是由於暫時性死區的原因,我們不能在let a
之前使用 a
。
為了證明我的猜想,我想先從let
宣告的建立、初始化和賦值過程入手。
{ let a = 0; a = 1; }
上述的程式碼塊中發生的過程如下:
let
宣告的變數,在環境建立變數;a=0
,將a
初始化為1;a=1
,對a
進行賦值。由該過程可知,如果我們在建立完變數後和初始化之前執行log()
方法,控制檯將會報錯:
let a = 'global' { console.log(a) // Uncaught ReferenceError: Cannot access 'a' before initialization let a = 1 }
由此一來我們就可以知道了let
在建立的過程被提升,而在初始化過程沒有被提升。
接下來我們來看看function/var
的建立、初始化和賦值過程,由此看看能否探究出它們的差別。
function foo() { console.log(a); // undefined var a = 0; var b = 1; } foo();
當我們執行foo()
時,發生以下過程(較為省略):
foo
建立環境;foo
中所有被var
宣告的變數,在這個環境中建立變數;a
賦值為0,b
賦值為1。由此我們可以知道var
宣告在程式碼執行前建立變數並初始化,所以當我們在var a = 0
之前執行log(a)
方法會得到 undefined 的結果。
foo('btqf'); function foo(name) { console.log("my name is" + name) // my name is btqf }
當我們執行foo
函數時,發生以下過程:
function
宣告的變數,在環境中建立變數;由此可見,function
宣告在程式碼執行前就建立、初始化並賦值。
let
的「建立」過程被提升了,但是初始化沒有提升。var
的「建立」和「初始化」都被提升了。function
的「建立」「初始化」和「賦值」都被提升了。值得一提的是const
與let
基本類似,唯一的區別在於const
只有建立和初始化,沒有賦值過程。
到此這篇關於深入瞭解JavaScript中let/var/function的變數提升的文章就介紹到這了,更多相關let/var/function變數提升內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45