摘要:變量提升什么是變量提升在函數(shù)體內(nèi)聲明的變量,無論你是在函數(shù)的最底端還是中間聲明的,那么都會把該變量的聲明提升到函數(shù)的最頂端相當于第一行,但是只是提升變量的聲明,不會賦值。
1、變量提升
什么是變量提升?
在函數(shù)體內(nèi)聲明的變量,無論你是在函數(shù)的最底端還是中間聲明的,那么都會把該變量的聲明提升到函數(shù)的最頂端(相當于第一行),但是只是提升變量的聲明,不會賦值。
var num = 10; fun(); //輸出結(jié)果為undefined function fun(){ console.log(num); var num = 20; } /*上面這個函數(shù)相當于: function fun(){ var num; console.log(num); num = 20; } */2、函數(shù)提升
什么是函數(shù)提升?
在JavaScript中以函數(shù)聲明的方式創(chuàng)建的函數(shù)就跟用var創(chuàng)建的變量一樣,它們的聲明都會提前聲明,這就使得我們在JavaScript中可以調(diào)用函數(shù)在前面,而聲明函數(shù)在后面,這就是函數(shù)提升。
func(); function func(){ alert(“函數(shù)執(zhí)行了!”); } /* 上面這段代碼相當于: function func(){ alert(“函數(shù)執(zhí)行了!”); } func(); */3、函數(shù)與變量同名時的變量提升
alert(fun); // 最終輸出結(jié)果為:輸出fun函數(shù)體 function fun(){ alert(“我是一個函數(shù)”); } var fun = “我是一個變量”; alert(fun); // 輸出:我是一個變量 /* 為什么第一個alert輸出的是fun函數(shù)體,而第二個alert輸出的是“我是一個變量”? 因為用var聲明的變量及function聲明的函數(shù)在執(zhí)行前都會將聲明提升到最前面,如果變量與函數(shù)同名, 那么在聲明的時候會忽略變量,只提升函數(shù)聲明! */ /* 上面這段代碼相當于: function fun(){ alert(“我是一個函數(shù)”); } alert(fun); fun = “我是一個變量”; alert(fun); */4、變量搜索原則(變量訪問原則)
在JavaScript中變量的訪問(搜索)是有原則的:
1)、首先在訪問變量的作用域(函數(shù))中查找該變量,如果找到直接使用 2)、如果沒有找到,去上一級作用域中查找,如果找到直接使用 3)、如果還是沒有找到,則再去上一級作用域中查找,知道全局作用域 4)、如果找到了就直接使用,如果沒有找到則報錯
var num = 123; function foo1(){ function foo2(){ console.log(num); } /*當調(diào)用foo2時,會首先去foo2這個作用域中查找是否有num變量,結(jié)果沒找到則去上一級作用域(即foo1)中查找是否有foo1變量, 結(jié)果還 是沒找到,則再去上一級作用域(全局作用域)中查找,結(jié)果找到了,則拿來使用*/ foo2(); }5、變量提升、變量搜索機制經(jīng)典面試題
fun(); console.log(b); console.log(c); console.log(a); functoin fun(){ var a = b = c = 9; console.log(a); console.log(b); console.log(c); }
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/100695.html
摘要:編譯原理在傳統(tǒng)編譯語言的流程中,程序中的一段源代碼在執(zhí)行之前會經(jīng)歷三個步驟,統(tǒng)稱為編譯。定義聲明是在編譯階段進行的,而賦值是在執(zhí)行階段進行的。 編譯原理 在傳統(tǒng)編譯語言的流程中,程序中的一段源代碼在執(zhí)行之前會經(jīng)歷三個步驟,統(tǒng)稱為編譯。 詞法分析將由字符組成的字符串分解成(對編程語言來說)有意義的代碼塊,這些代碼塊被稱為詞法單元(token)。 語法分析這個過程是將詞法單元流(數(shù)組)轉(zhuǎn)...
摘要:關于本書,我會寫好幾篇讀書筆記用以記錄那些讓我恍然大悟的瞬間,本文是第一篇弄懂的作用域和閉包。作用域也可以看做是一套依據(jù)名稱查找變量的規(guī)則。聲明實際上是根據(jù)你傳遞給它的對象憑空創(chuàng)建了一個全新的詞法作用域。 《你不知道的JavaScript》真的是一本好書,閱讀這本書,我有多次哦,原來是這樣的感覺,以前自以為理解了(其實并非真的理解)的概念,這一次真的理解得更加透徹了。關于本書,我會寫好...
摘要:不同的是函數(shù)體并不會再被提升至函數(shù)作用域頭部,而僅會被提升到塊級作用域頭部避免全局變量在計算機編程中,全局變量指的是在所有作用域中都能訪問的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎與實踐技巧系列文章。本文詳細討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對象以及如何避免創(chuàng)建...
摘要:作用域分類作用域共有兩種主要的工作模型。換句話說,作用域鏈是基于調(diào)用棧的,而不是代碼中的作用域嵌套。詞法作用域詞法作用域中,又可分為全局作用域,函數(shù)作用域和塊級作用域。 一篇鞏固基礎的文章,也可能是一系列的文章,梳理知識的遺漏點,同時也探究很多理所當然的事情背后的原理。 為什么探究基礎?因為你不去面試你就不知道基礎有多重要,或者是說當你的工作經(jīng)歷沒有亮點的時候,基礎就是檢驗你好壞的一項...
摘要:也毫不例外,但在中作用域的特性與其他高級語言稍有不同,這是很多學習者久久難以理清的一個核心知識點。主要使用的是函數(shù)作用域。 關于作用域:About Scope 作用域是程序設計里的基礎特性,是作用域使得程序運行時可以使用變量存儲值、記錄和改變程序的狀態(tài)。JavaScript 也毫不例外,但在 JavaScript 中作用域的特性與其他高級語言稍有不同,這是很多學習者久久難以理清的一個核...
閱讀 1164·2021-10-12 10:11
閱讀 946·2019-08-30 15:53
閱讀 2380·2019-08-30 14:15
閱讀 3033·2019-08-30 14:09
閱讀 1257·2019-08-29 17:24
閱讀 1027·2019-08-26 18:27
閱讀 1330·2019-08-26 11:57
閱讀 2237·2019-08-23 18:23