inputstream重新赋值之前需要close吗_变量提升真的搞懂了吗?打脸的一道题
變量提升真的搞懂了嗎?打臉的一道題
我們知道JS代碼在執(zhí)行之前,會(huì)做一系列的事情,其中就包括變量提升,原本以為把變量提升搞懂的我(因?yàn)檫@兩天一直在研究變量提升,自我感覺(jué)已經(jīng)很良好了,哈哈哈),拿到了一道打臉的題。當(dāng)然了,拿給身邊的程序員朋友們,做對(duì)的也......廢話不多說(shuō),一起來(lái)看下這道題吧。
1. 題目
var a = 0; if (true) {a = 1;function a() {};a = 21;console.log(a) } console.log(a);答案:21 1
2. 重新學(xué)習(xí)變量提升
2.1 var
首先說(shuō)使用var聲明的變量,只要那個(gè)變量是使用var聲明的,那么在變量提升階段要做的事情只有一個(gè),就是去聲明這個(gè)變量。
一道簡(jiǎn)單的題目看懂var的變量提升
console.log(a); var a = 1; console.log(a);- 在代碼執(zhí)行之前先創(chuàng)建一個(gè)變量a;此時(shí)并不會(huì)進(jìn)行賦值等操作
- 代碼執(zhí)行
- console.log(a);因?yàn)榇藭r(shí)已經(jīng)有a這個(gè)變量了,只不過(guò)沒(méi)有賦值,因此輸出undefined
- var a = 1;給變量a進(jìn)行賦值為1
- console.log(a);這時(shí)候再輸出a的值,就是上面的賦值結(jié)果1
控制臺(tái)查看輸出結(jié)果
2.2 let const
我們知道使用let和const聲明的變量沒(méi)有變量提升,只有當(dāng)代碼走到那一行才會(huì)去執(zhí)行聲明等操作;
2.3 function
當(dāng)function fn(){...}沒(méi)有在if/for等任何大括號(hào)內(nèi)的時(shí)候,它會(huì)聲明+定義,即:
- 把右邊的值存儲(chǔ)在堆內(nèi)存中,并把堆內(nèi)存地址存儲(chǔ)在棧內(nèi)存;
- 然后聲明變量fn,
- 最后讓fn和堆地址關(guān)聯(lián)
但如果把上面的這句話放在if/for這樣的大括號(hào)內(nèi)的時(shí)候,就變成下面這樣的過(guò)程了:
- 聲明一個(gè)變量fn存儲(chǔ)在棧內(nèi)存中
- 當(dāng)滿足條件進(jìn)入到大括號(hào)內(nèi)的時(shí)候
- 第一件事情就是定義這個(gè)函數(shù):即讓這個(gè)變量名和堆地址進(jìn)行關(guān)聯(lián)。注意此時(shí)這個(gè)變量fn已經(jīng)變?yōu)檫@個(gè)塊內(nèi)私有的變量了,和外面的fn沒(méi)有任何關(guān)系;
- 當(dāng)代碼執(zhí)行過(guò)程中,遇到function fn(){...}的時(shí)候,它會(huì)去把全局中的fn修改一下,修改為堆中fn的值。修改完之后,后面對(duì)fn的操作又和全局的fn沒(méi)任何關(guān)系
3.看穿題目的'廬山真面目'
這道題就是利用上面的所說(shuō)到function的變量提升情況。即當(dāng)在if/for中存在函數(shù),并且條件成立,那么這個(gè)函數(shù)就變?yōu)樗接?#xff0c;直到遇到function fn(){...}的時(shí)候才會(huì)去操作全局的fn,其它情況操作的fn都是私有的。
下面是這道題的圖解過(guò)程
4. 同類(lèi)型題目的練習(xí)
{function foo(){}foo=1; } console.log(foo);{function foo(){}foo=1;function foo(){} } console.log(foo);{function foo(){}foo=1;function foo(){}foo=2; } console.log(foo);5. 總結(jié)
這也是瀏覽器為了解決新老版本改善的function的變量提升機(jī)制,可以看出也是在一步步的完善,因此我們也要不斷的學(xué)習(xí),才可以跟上互聯(lián)網(wǎng)的快速發(fā)展。
總結(jié)
以上是生活随笔為你收集整理的inputstream重新赋值之前需要close吗_变量提升真的搞懂了吗?打脸的一道题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: yaml加配置文件后起不来_YAML配置
- 下一篇: 直接利用工具将prn文件打印到打印机的方