作用域
所謂作用域,就是變數或者是函式能作用的範圍。
那麼JavaScript裡有什麼作用域呢? 1、全域性作用域
除了函式中定義的變數之外,都是全域性作用域。
舉個栗子:
var a = 10;
function bar(){
console.log(a);
}
bar();//10
複製程式碼
以上的a就是全域性變數,到處可以訪問a。 然鵝,
var a = 10;
function bar(){
console.log(a);
var a = 20;
}
bar();//undefined
複製程式碼
什麼鬼?undefined? 是的,你沒看錯。因為先搜尋函式的變數看是否存在a,存在,又由於a被預解析(變數提升),提升的a繫結了這裡的a作用域,所以結果就是undefined。 2、區域性作用域
函式裡用var宣告的變數。
舉個栗子:
var a = 10;
function bar(){
var a = 20;
console.log(a);
}
bar();//20
複製程式碼
3、沒有塊級作用域(至ES5),ES6中有塊級作用域
ES6之前,除了函式之外的塊都不具備塊級作用域。
常見的經典例子:
for(var i=0;i<4;i++){
setTimeout(function(){
console.log(i);
},200);
}
//4 4 4 4
複製程式碼
解決辦法:
for(var i=0;i<4;i++){
(function(j){
setTimeout(function(){
console.log(j);
},200);
})(i)
}
//0 1 2 3
複製程式碼
作用域鏈
變數隨著作用長輩函式一級一級往上搜尋,直到找到為止,找不到就報錯,這個過程就是作用域鏈起的作用。
var num = 30;
function f1(){
var num = 20;
function f2(){
var num = 10;
function f3(){
var num = 5;
console.log(num);
}
f3();
}
f2();
}
f1();
複製程式碼