一:js 中的變數提升 例1 a = 2; var a; console.log(a); 答:2 解析:它會將當前作用域的所有變數的聲明提升到程式的頂部,上述代碼等價為: var a; a = 2 console.log(a); // 2 例2: console.log(a);// undefine ...
一:js 中的變數提升
例1
a = 2; var a; console.log(a);
答:2
解析:它會將當前作用域的所有變數的聲明提升到程式的頂部,上述代碼等價為:
var a; a = 2 console.log(a); // 2
例2:
console.log(a);// undefined var a = 2;
解析:變數的聲明提升到程式的頂部;等價於:
var a; console.log(a); a = 2;
問題:為什麼會有變數提升?
其實啊,js和其他語言一樣,都要經歷編譯和執行階段,而在編譯的時候,會搜集所有的變數並且在本作用域內提前聲明,而且其他代碼都不會改變順序。
1:作用域:除了函數外,js是沒有塊級作用域
2:作用域鏈:內部可以訪問外部的變數,但是外部不能訪問內部的變數。 註意:如果內部有,優先查找到內部,如果內部沒有就查找外部的。
3:js的變數聲明:js的變數聲明其實大體上可以分為三種:var聲明、let與const聲明和函數聲明。
函數聲明與其他聲明一起出現的時候,是以誰為準呢?答案就是,函數聲明高於一切,畢竟函數是js的第一公民。
所以下麵函數的調用會輸出誰呢? 答案是 foo
foo(); function foo() { console.log('foo'); }
var foo = 2;
那麼下麵又會輸出誰呢?
foo(); function foo() { console.log('1'); } function foo() { console.log('2'); }
答案是: 2 因為有多個函數聲明的時候,是由最後面的函數聲明來替代前面的。
那下列程式優惠輸出什麼呢?
foo(); var foo = function() { console.log('foo'); }
答案是報了Uncaught TypeError: foo is not a function 的異常
例3:
function c(){ var b=2 function a(){ console.log(b); // undefind var b=3 console.log(b); // 3 } a() console.log(b); // 2 } c()