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