javascript
javascript变量提升/函数提升
首先 javascript 是一種弱類型、動態(tài)的、解釋型的腳本語言。
弱類型:類型檢查不嚴格,偏向于容忍隱式類型轉(zhuǎn)換。
強類型:類型檢查嚴格,偏向于不容忍隱式類型轉(zhuǎn)換。
動態(tài)類型:運行的時候執(zhí)行類型檢查。
靜態(tài)類型:編譯的時候就知道每個變量的類型。
解釋型:程序不需要編譯,程序在運行的時候才翻譯成機器語言,每執(zhí)行一次都要翻譯一次,因此效率比較低,但是跨平臺性好。
編譯型:程序在執(zhí)行之前需要一個專門的翻譯過程,把程序編譯為機器語言的文件,運行時直接使用編譯的結(jié)果就行了。
標(biāo)記語言:標(biāo)記語言的存在就是用來被讀取(瀏覽)的,而其本身是沒有行為能力的,在標(biāo)記語言里你會看到<和>這些尖括號,這是用來寫出“層次”和”屬性”的,換句話說,它是被動的。并不具備與訪問者互動的能力。
編程語言:它是具有邏輯性和行為能力,這是主動的。說通俗一點,它是有思想的。
腳本語言:它介于標(biāo)記語言和編程語言之間,腳本語言不需要編譯,可以直接用,由解釋器來負責(zé)解釋。
js代碼解析原則
首先js引擎在讀取js代碼時會進行兩個步驟,第一個步驟是解釋,第二個步驟是執(zhí)行。
所謂解釋就是會先通篇掃描所有的Js代碼,然后把所有聲明提升到頂端,第二步是執(zhí)行,執(zhí)行就是操作一類的。
例子1:
<script type="text/javascript">console.log(a);//輸出結(jié)果 undefinedvar a=10; </script>以上代碼輸出 undefined
原因: 變量提升(把變量聲明提升到當(dāng)前執(zhí)行環(huán)境的最頂端)
上段代碼相當(dāng)于:
例2:
foo(); function foo(){console.log("aaa"); }結(jié)果輸出: aaa
原理:函數(shù)聲明提升 (函數(shù)聲明提升直接把整個函數(shù)提到執(zhí)行環(huán)境的最頂端)
相當(dāng)于:
function foo(){console.log("aaa");}foo();變量提升只提升函數(shù)名 而函數(shù)提升會提升整個函數(shù)題 注意:函數(shù)提升在變量提升上面。
例3:
foo(); var foo = function(){console.log("aaa"); }運行結(jié)果是: foo is not a function
原因: 還是進行了變量提升
相當(dāng)于:
上面代碼輸出undefined 是因為變量提升后并沒有賦值因此輸出undefined
輸出foo is not a function 原因是:js解析遇到 foo()時會默認當(dāng)做函數(shù)來解析
例4:
console.log(foo); var foo=10; console.log(foo); function foo(){console.log(10); } console.log(foo);輸出結(jié)果:
這里寫圖片描述
原理:
相當(dāng)于:
注意: 函數(shù)提升在變量提升上面,第一個console.log(foo);為什么會輸出函數(shù)題呢,原因在于 var foo; 并未有賦值只是聲明,因此他會調(diào)用上面的值
例如:
var b=10; b=10; console.log(b); //10 輸出上一個值不會輸出undefined但是更改后:
var b=10; b=20; console.log(b); //20 輸出20不是上一個值總結(jié):關(guān)于變量提升,一定要注意細心思考一下,還有就是要牢記,函數(shù)提升在變量提升之上
轉(zhuǎn)自:http://blog.csdn.net/demo_18/article/details/78493489
總結(jié)
以上是生活随笔為你收集整理的javascript变量提升/函数提升的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中的order_Hive中O
- 下一篇: react更改路由入参_JavaScri