提公升的物件包括:
函式宣告
變數宣告
函式內部作用域預設形參宣告
1.函式宣告和變數宣告是同乙個變數名
當函式宣告和變數宣告衝突的時候,變數宣告無法覆蓋函式宣告,變數賦值可以覆蓋函式宣告 所以最後結果為10
具體**:
a
(a)//呼叫函式
a =10;
//變數
var a;
//全域性變數
//或者 var a = 10; 同上面兩句
function
a(a)
console.
log(a)
//10
看到這個有的人會一臉懵逼,為什麼函式a還沒有宣告就可以呼叫,a還沒宣告就可以賦值,這全是因為瀏覽器對js**的預解析,這是**執行之前的操作,也叫變數提公升。
函式和定義變數會被提公升到當前作用域最頂端,當函式名和定義變數名字一樣時,函式名會覆蓋變數定義。
預解析完成後的**:
//上面預解析完成後是
function
a(a)
a(a)
//呼叫函式
a =10;
//給變數a重新賦值覆蓋函式體
console.
log(a)
//10
2.函式形參和變數宣告是同乙個變數名
a
(a)//呼叫函式
a =10;
//變數
b=20;
//變數
var a;
//全域性變數
function
a(a)
var b;
console.
log(a)
//10
當函式呼叫的時候,就要進入函式的區域性作用域 瀏覽器還要重新再區域性作用域中進行預解析,變數名定義提前 賦值不會提前。
引數的傳遞和函式中變數名衝突,函式形參的值會覆蓋預解析的效果
在函式執行之前進行預解析,這時候引數還沒傳遞
預解析以後 函式內**開始執行 傳參
在函式中如果沒有定義這個變數 就要在全域性作用域中查詢
賦值的時候函式中沒有這個變數根據作用域鏈也會將全域性這個變數的值發生改變
函式體內正常預解析**,沒有形參參與:
var b;
function
a(a)
a(a)
//呼叫函式
a =10;
//變數
b =20;
//變數
console.
log(a)
//10
函式開始執行,形參接受到實參的時候:
var b;
function
a(a)
a(a)
//呼叫函式
a =10;
//變數
b =20;
//變數
console.
log(a)
//10
console,
log(b)
//20
在執行函式的時候,函式內部有用到b,並且被重新賦值,b由undefined變成200,改變全域性變數的值,在後面的同步**中b又被重新賦值,所以最終列印b的值為20。
js對什麼進行預解析?
函式傳參的變數
var 後面的變數
.函式
都會提公升到當前作用域最頂端,同名下,函式宣告可以覆蓋變數宣告,函式體內區域性預解析形參宣告可以覆蓋變數宣告,賦值可以改變變數的值。
js會給這些 變數、函式 賦予什麼初始值呢?
傳參,直接賦值引數;
var 的,都會賦予乙個 undefined 作為初始值;
函式,直接賦予 函式本身 作為初始值;(所以這就是為什麼我們可以把 函式呼叫 放到 函式宣告 之前的原因)
瀏覽器的預解析過程
var foo function foo console.log foo 結果是函式體function foo 接著下面一道題 function foo var foo console.log foo 結果也是函式體function foo 所有就有很多人說,函式宣告的優先順序大於變數宣告的優先順序...
預解析和變數提公升
doctype html en utf 8 viewport content width device width,initial scale 1.0 document title head var f functionf console.log f f 123 var fn 123 functio...
預解析 變數提公升 相關題
預解析 瀏覽器在解析js的過程中,至少有兩步,預解析,逐行執行。預解析 找一些東西,找var function,把var 和function的宣告提到最前面。找var 提前宣告一下變數,儲存在記憶體中,如果變數同名宣告一次。function 提前宣告函式,儲存在記憶體中,如果同名會多次宣告。逐行執行...