摘要:很多初學(xué)者弄不清變量提升和函數(shù)提升,整理寫幾個(gè)例子,分析一下,你很快搞明白怎么分析。精華放在最上面,兩個(gè)最基本的原則函數(shù)聲明優(yōu)先先聲明,后賦值,聲明和賦值是分開(kāi)的。
很多初學(xué)者弄不清變量提升和函數(shù)提升,整理寫幾個(gè)例子,分析一下,你很快搞明白怎么分析。
精華放在最上面,兩個(gè)最基本的原則:
函數(shù)聲明優(yōu)先
先聲明,后賦值,聲明和賦值是分開(kāi)的。
讓我們看幾個(gè)例子并解釋下
先看這個(gè)例子:
var test=0 var test function test(){ console.log(1) } console.log(test)
結(jié)果輸出 0
分析一下: 顯然程序中變量test有3次聲明,誰(shuí)先呢? 記住一個(gè)原則,函數(shù)聲明優(yōu)先,所以優(yōu)先的是 function test(), 那么執(zhí)行順序按邏輯上可以換成
function test(){ console.log(1) } var test=0 var test
然后程序中聲明了又一次test ,但其實(shí)test已被聲明過(guò)了,所以實(shí)際上第二句只是賦值,將0賦值給test。第三句不起效果,因?yàn)槁暶鬟^(guò)了嘛,所以不是undefined。
再看個(gè)例子:
test = 1 function show(){ console.log(test) var test var test = 0 console.log(test) } console.log(test) var test = 3 show() console.log(test)
按第二原則,我們發(fā)現(xiàn)程序中有一句 var test= 3, 這個(gè)地方聲明過(guò)test,我們整體下程序邏輯,變成
var test test = 1 function show(){ console.log(test) var test var test = 0 console.log(test) } console.log(test) test = 3 show() console.log(test)
你可能會(huì)說(shuō)搞不清show() 里發(fā)生了什么,解釋一下,同樣套那兩條原則中的第二條,先聲明,后賦值,show()整理為
function show(){ var test console.log(test) test = 0 console.log(test) }
啊哈,so明顯,show()中的第一次輸出應(yīng)該是undefined,第二次輸出是0
我們把整個(gè)程序整理下:
var test test = 1 function show(){ var test console.log(test) //undefined test = 0 console.log(test) //0 } console.log(test) //1 test = 3 show() console.log(test) //3
輸出我已經(jīng)注釋上了,很容易,對(duì)吧?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/92954.html
摘要:對(duì)于大多數(shù)開(kāi)發(fā)者來(lái)說(shuō),變量提升可以說(shuō)是一個(gè)非常常見(jiàn)的問(wèn)題,但是可能很多人對(duì)其不是特別的了解。如果說(shuō)擁有和一樣的變量提升效果的話,那么應(yīng)該是輸出。而和它們的變量提升的效果是一樣的,也都存在著臨死性死區(qū)的概念。 對(duì)于大多數(shù)js開(kāi)發(fā)者來(lái)說(shuō),變量提升可以說(shuō)是一個(gè)非常常見(jiàn)的問(wèn)題,但是可能很多人對(duì)其不是特別的了解。所以在此,我想來(lái)講一講。 先從一個(gè)簡(jiǎn)單的例子來(lái)入門: a = 2; var a; ...
摘要:作用域是代碼的不同部分在運(yùn)行期間的可見(jiàn)性。大多數(shù)開(kāi)發(fā)者想當(dāng)然地理解作用域,但毫無(wú)疑問(wèn),有它自己的說(shuō)明。變量可能是全局作用域的,或者是方法作用域的??偠灾?,不要重復(fù)聲明變量,使用良好命名,盡力避免在聲明前調(diào)用和執(zhí)行任何東西。 原文鏈接:https://hackernoon.com/unders... 什么是作用域? 就像JavaScript中的其他東西一樣,作用域并無(wú)特別之處。盡管大多...
摘要:如下代碼輸出的結(jié)果是代碼執(zhí)行分為兩個(gè)大步預(yù)解析的過(guò)程代碼的執(zhí)行過(guò)程預(yù)解析與變量聲明提升程序在執(zhí)行過(guò)程中,會(huì)先將代碼讀取到內(nèi)存中檢查,會(huì)將所有的聲明在此進(jìn)行標(biāo)記,所謂的標(biāo)記就是讓解析器知道有這個(gè)名字,后面在使用名字的時(shí)候不會(huì)出現(xiàn)未定義的錯(cuò)誤。 showImg(https://segmentfault.com/img/remote/1460000012922850); 如下代碼輸出的結(jié)果是...
摘要:變量的作用域無(wú)非就是兩種全局變量和局部變量。其中內(nèi)部函數(shù)中可以訪問(wèn)外部函數(shù)的變量,是因?yàn)閮?nèi)部函數(shù)的作用域鏈中包含了外部函數(shù)的作用域也可以理解為內(nèi)部函數(shù)的作用范圍輻射到了外部函數(shù)的作用范圍另一方面,在函數(shù)外部自然無(wú)法讀取函數(shù)內(nèi)的局部變量。 以前學(xué)習(xí)的時(shí)候,了解過(guò)變量提升和閉包,但是沒(méi)有深入了解,網(wǎng)上查了資料,這里記錄下,只供參考。部分內(nèi)容引用: https://www.cnblogs.c...
摘要:為啥因?yàn)樽兞刻嵘兞康穆暶鞅惶嵘疆?dāng)前作用域的頂部了。也就是可以想象成這樣此外,還有函數(shù)提升,和變量提升類似和被提升了,所以不會(huì)報(bào)錯(cuò)。開(kāi)始處理函數(shù)聲明,再次提醒,函數(shù)表達(dá)式不會(huì)被處理。 變量提升 & 函數(shù)提升 function f() { console.log(a); // ? var a = 1; } f(); 簡(jiǎn)單簡(jiǎn)單,打印結(jié)果是 undefined。為啥?因?yàn)?..
閱讀 2412·2021-10-08 10:04
閱讀 1190·2021-09-03 10:40
閱讀 1214·2019-08-30 15:53
閱讀 3357·2019-08-30 13:13
閱讀 2985·2019-08-30 12:55
閱讀 2336·2019-08-29 13:21
閱讀 1477·2019-08-26 12:12
閱讀 2814·2019-08-26 10:37