首先js引擎在讀取js**時會進行兩個步驟,第乙個步驟是解釋,第二個步驟是執行。
所謂解釋就是會先通篇掃瞄所有的js**,然後把所有宣告提公升到頂端,第二步是執行,執行就是操作一類的。
例子1:
console.log(a);//輸出結果 undefined
var a=10;
script>
以上**輸出 undefined
原因: 變數提公升(把變數宣告提公升到當前執行環境的最頂端)
上段**相當於:
var a;
console.log(a);//由於未賦值 所以輸出undefined
a=10;
例2:
foo();
function foo()
結果輸出: aaa
原理:函式宣告提公升 (函式宣告提公升直接把整個函式提到執行環境的最頂端)
相當於:
function foo()
foo();
變數提公升只提公升函式名 而函式提公升會提公升整個函式題 注意:函式提公升在變數提公升上面。
例3:
foo();
var foo = function()
執行結果是: foo is not a function
原因: 還是進行了變數提公升
相當於:
var foo;
console.log(foo); //undefined
foo(); //foo is not a function
foo = function()
上面**輸出undefined 是因為變數提公升後並沒有賦值因此輸出undefined
輸出foo is not a function 原因是:js解析遇到 foo()時會預設當做函式來解析
例4:
console.log(foo);
var foo=10;
console.log(foo);
function foo()
console.log(foo);
輸出結果:
原理:
相當於:
function foo()
var 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不是上乙個值
**: 變數提公升和函式提公升
1.變數宣告提公升 通過var 定義 宣告 的變數,在定義語句之前就可以訪問到。值 undefined console.log a undefined var a 23 console.log a 23上面 等價於 var a 預編譯,將變數宣告提公升至當前作用域的頂端,初始值為undefined ...
javascript變數提公升和函式提公升
variable hoisting變數提公升是js比較有特點的地方,它允許你先使用變數,在其後面再進行變數宣告,不會丟擲 uncaught referenceerror異常。雖然變數被提公升到前面,但是它的預設值則是undefind,在引用的時候也使用這個值,知道在其面後進行賦值,在使用時候即為所贖...
JS函式提公升和變數提公升
js引擎在執行整個js 的過程中,分為倆步。第一步是讀取和解析js 第二部是執行。在引擎解析js 的時候,當解析器遇見變數宣告 var 變數名 和函式宣告 function 函式名 的時候,會將這些宣告提到各自作用域的最前面。在es6之前,js是沒有塊級作用域的。只有2種作用域 注 在其他語言中,被...