了解javascript中變量及函數(shù)的提升
javascript中變量以及函數(shù)的提升,在我們平時的項目中其實還是挺常用的,尤其是大型項目中,不知不覺就會順手添加一些變量,而有時候自己的不小心就會釀成一些不必要錯誤,趁有時間整理一下自己對于js中變量及函數(shù)提升的理解。
首先,看一個題目:
console.log(a); // undefined
var a = 1;
console.log(a); // 1
console.log(b());
function b(){return 2;} // 2
console.log(c) //報錯
let c = 4;
console.log(d()) // 報錯
var d = function(){return 3;} // 報錯
(function(){
var m = n = 1;
})()
console.log(m) //報錯
console.log(n) // 1
上面的實例對于javascript變量及函數(shù)提升的可謂是淋漓盡致...
一、javascript 變量的提升
-函數(shù)及變量的聲明都將被提升到函數(shù)的最頂部
-變量可以在使用后聲明,也就是變量可以先使用再聲明
敲黑板,劃重點,是變量的聲明,聲明,聲明,當(dāng)變量或函數(shù)已經(jīng)初始化之后,就不會提升到函數(shù)的最頂部。這里上面的變量a已經(jīng)初始化了,所以第一個console取不到變量a得值,為undefined;
注意:變量的提升只會提升到當(dāng)前作用域下
二、javascript函數(shù)的提升
而函數(shù)b僅僅是先聲明了一個函數(shù)方法,函數(shù)c是函數(shù)表達(dá)式無法提升,所以在嚴(yán)格模式下b=2;d報錯
對于m,n,這里就涉及到j(luò)avascript作用域的問題
首先,var m = n = 1的執(zhí)行順序是什么?并不是我們大多數(shù)人心中所想的連續(xù)賦值,javascript的賦值是從右向左的,而是 n=1;var m = n;很好,一目了然,在函數(shù)作用域內(nèi)的變量m=n,n是全局變量,最后嚴(yán)格模式下輸出結(jié)果,n=1,m報錯;
三、關(guān)于es6兩個關(guān)鍵字——let和const
let 聲明的變量只在 let 命令所在的代碼塊內(nèi)有效,不存在變量的提升
const 聲明一個只讀的常量,一旦聲明,常量的值就不能改變。一旦聲明必須初始化,否則就會報錯
來個對比很明顯的栗子(完美的體現(xiàn)出let命令只在代碼塊內(nèi)有效的意思):
{
let test = 2;
var web = 'font';
}
console.log(test); // 報錯
console.log(web); // font
再次回到上面的題目,c就是報錯的
ES6 明確規(guī)定,代碼塊內(nèi)如果存在 let 或者 const,代碼塊會對這些命令聲明的變量從塊的開始就形成一個封閉作用域。代碼塊內(nèi),在聲明變量 PI 之前使用它會報錯。
var PI = "a";
if(true){
console.log(PI); // 報錯,即使函數(shù)外面全局聲明了PI,但在代碼塊內(nèi)還是會報錯
const PI = "3.1415926";
}
以上,就是關(guān)于javascript中變量提升的理解。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
nodejs服務(wù)搭建教程 nodejs訪問本地站點文件
這篇文章主要為大家詳細(xì)介紹了nodejs服務(wù)搭建教程,訪問本地站點文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
從Node.js事件觸發(fā)器到Vue自定義事件的深入講解
這篇文章主要給大家介紹了關(guān)于從Node.js事件觸發(fā)器到Vue自定義事件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
socket.io與pm2(cluster)集群搭配的解決方案
這篇文章主要給大家介紹了關(guān)于socket.io與pm2(cluster)集群搭配的解決方案,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來看看吧。2017-06-06
使用Typescript和ES模塊發(fā)布Node模塊的方法
這篇文章主要介紹了使用Typescript和ES模塊發(fā)布Node模塊的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
nodejs實現(xiàn)的連接MySQL數(shù)據(jù)庫功能示例
這篇文章主要介紹了nodejs實現(xiàn)的連接MySQL數(shù)據(jù)庫功能,結(jié)合實例形式分析了nodejs連接及查詢mysql數(shù)據(jù)的相關(guān)操作步驟與實現(xiàn)技巧,需要的朋友可以參考下2018-01-01
NodeJs使用Mysql模塊實現(xiàn)事務(wù)處理實例
本篇文章主要介紹了NodeJs使用Mysql模塊實現(xiàn)事務(wù)處理 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

