摘要:變量提升變量提升即將變量聲明提升到它所在作用域的最開始的部分,即函數(shù)聲明和變量聲明總是被解釋器隱式地提升到包含他們的作用域的最頂端。閑先聲明一個(gè)變量名為的變量,同時(shí)賦值為。但是,上面的代碼運(yùn)行的結(jié)果是這就是我今天關(guān)注的東西變量提升。
變量提升
變量提升即將變量聲明提升到它所在作用域的最開始的部分,即函數(shù)聲明和變量聲明總是被JavaScript解釋器隱式地提升(hoist)到包含他們的作用域的最頂端。在ES6之前,JavaScript沒有塊級(jí)作用域(一對(duì)花括號(hào){}即為一個(gè)塊級(jí)作用域),只有全局作用域和函數(shù)作用域。
首先看一段簡(jiǎn)單的代碼
var name = "Clam"; (function (){ console.log(name); })(); // Clam
上面的代碼很簡(jiǎn)單。閑先聲明一個(gè)變量名為name的變量,同時(shí)賦值為Clam。后面是一個(gè)立即執(zhí)行函數(shù),在函數(shù)體中控制臺(tái)輸出name。結(jié)果為Clam,沒毛病~接著看下面的代碼。
簡(jiǎn)單的修改一下上面的代碼
var name = "Clam"; (function (){ console.log(name); var name = "Klay"; })()
首先我們自己分析一下上面的代碼哈:首先聲明了一個(gè)變量name并且賦值為Clam,緊接著也是一個(gè)立即執(zhí)行函數(shù),在函數(shù)體中首先控制臺(tái)輸出了name,但是之后,又聲明了賦值了一次變量name。
那我來猜想一下,恩,控制臺(tái)輸出了Clam,但是在立即執(zhí)行函數(shù)結(jié)束之后,變量name的值被修改成了Klay。
但是,上面的代碼運(yùn)行的結(jié)果是:
undifined // exm??
這就是我今天關(guān)注的東西:變量提升。
前面說過,變量提升會(huì)將變量的聲明提升到其作用域的最前端。這里,name所在的作用域就是指這個(gè)函數(shù)作用域,上面的代碼就相當(dāng)于以下代碼。
var name = "Clam"; (function (){ var name; console.log(name); //undefined name = "Klay"; })()函數(shù)提升
js中創(chuàng)建函數(shù)有兩種方式:函數(shù)聲明式和函數(shù)字面量式。只有函數(shù)聲明才存在函數(shù)提升。
console.log(f1); // function f1() {} console.log(f2); // undefined function f1() {} var f2 = function() {}
以上,enjoy
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89202.html
摘要:變量提升什么是變量提升在函數(shù)體內(nèi)聲明的變量,無論你是在函數(shù)的最底端還是中間聲明的,那么都會(huì)把該變量的聲明提升到函數(shù)的最頂端相當(dāng)于第一行,但是只是提升變量的聲明,不會(huì)賦值。 1、變量提升 什么是變量提升?在函數(shù)體內(nèi)聲明的變量,無論你是在函數(shù)的最底端還是中間聲明的,那么都會(huì)把該變量的聲明提升到函數(shù)的最頂端(相當(dāng)于第一行),但是只是提升變量的聲明,不會(huì)賦值。 var num = 10; fu...
摘要:代碼在執(zhí)行時(shí)并不完全是由上到下一行一行執(zhí)行的,由此產(chǎn)生了一個(gè)提升的問題。第二個(gè)賦值聲明會(huì)被留在原地等待執(zhí)行階段??梢缘弥瘮?shù)聲明提升的優(yōu)先權(quán)大于普通變量聲明。 JavaScript代碼在執(zhí)行時(shí)并不完全是由上到下一行一行執(zhí)行的,由此產(chǎn)生了一個(gè)提升的問題。 什么是提升 可以簡(jiǎn)單理解為:聲明(變量和函數(shù))都會(huì)被移動(dòng)到各自作用域的最頂端,這個(gè)過程被稱為提升。 具體例子看提升 下面兩個(gè)例子a會(huì)l...
摘要:即的變量提升此處變量未聲明時(shí)便可以使用,其實(shí)是因?yàn)闀?huì)自動(dòng)將聲明語(yǔ)句提升到頂部。但名字的初始化卻是按其在代碼中書寫的順序進(jìn)行的,不受以上優(yōu)先級(jí)的影響。 變量提升(hoisting) 在JavaScript中,函數(shù)、變量的聲明都會(huì)被提升(hoisting)到該函數(shù)或變量所在的scope的頂部。即——JavaScript的變量提升. var x = 5; alert(x); ...
摘要:作用域的類別可以影響到變量的取值,分為詞法作用域靜態(tài)作用域和動(dòng)態(tài)作用域。而,采用的就是詞法作用域,或者叫靜態(tài)作用域。 關(guān)于javascript中的作用域和作用域鏈 我GitHub上的菜鳥倉(cāng)庫(kù)地址: 點(diǎn)擊跳轉(zhuǎn)查看其他相關(guān)文章 文章在我的博客上的地址: 點(diǎn)擊跳轉(zhuǎn) ? ? ? ? 前面的文章說到, 執(zhí)行上下文的創(chuàng)建階段,主要有三個(gè)內(nèi)容: ? ? ? ? 1、創(chuàng)建變量對(duì)象;2、初始化作用域...
摘要:不同的是函數(shù)體并不會(huì)再被提升至函數(shù)作用域頭部,而僅會(huì)被提升到塊級(jí)作用域頭部避免全局變量在計(jì)算機(jī)編程中,全局變量指的是在所有作用域中都能訪問的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語(yǔ)法基礎(chǔ)與實(shí)踐技巧系列文章。本文詳細(xì)討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對(duì)象以及如何避免創(chuàng)建...
閱讀 2483·2021-11-16 11:45
閱讀 2457·2021-10-11 10:59
閱讀 2260·2021-10-08 10:05
閱讀 3852·2021-09-23 11:30
閱讀 2381·2021-09-07 09:58
閱讀 819·2019-08-30 15:55
閱讀 782·2019-08-30 15:53
閱讀 1931·2019-08-29 17:00