什么是作用域?
JS中的變量或者函數(shù)能夠被訪問(wèn)到的代碼空間(變量或者函數(shù)有效的范圍)。
JavaScript中的作用域:全局作用域; 局部作用域;
當(dāng)一個(gè)變量在函數(shù)最外層定義時(shí),變量就在全局作用域中,在一個(gè)函數(shù)內(nèi)部定義一個(gè)變量,這個(gè)變量就在局部變量中。
全局作用域
最外層函數(shù)或者在其外部定義的變量具有全局作用域。
var a = 10; //全局變量
function foo(){ //全局函數(shù)
console.log(a);
}
這個(gè)變量a就在全局作用域中,可以說(shuō)成是個(gè)全局變量,這個(gè)a可以子啊認(rèn)可地方訪問(wèn)或修改。
還有一點(diǎn),window對(duì)象的屬性和方法具有全局作用域
Eg:
alert("dddddd");
window.alert("aaaa");
var obj = {
name:"john",
age:20,
sayHello:function(x){
console.log(x);//輸出undefined//第二次輸出1//第三次輸出aaa(要問(wèn)我為什么會(huì)輸出三次,因?yàn)槁暶魈嵘膯?wèn)題,請(qǐng)自行百度)
}
};
console.log(obj.name);//輸出jogn
obj.sayHello();
console.log(obj.sayHello(1))//輸出undefined
obj.sayHello("aaaaa");
在一個(gè)函數(shù)內(nèi)部聲明一個(gè)變量不用 var來(lái)定義,這個(gè)變量具有全局作用域
function foo(){
b = 20;
var a = 10;
}
foo();
console.log(b);
console.log(a);//a會(huì)報(bào)錯(cuò),因?yàn)閍 是一個(gè)局部變量
局部作用域
定義在函數(shù)中的變量就在局部作用域中。并且函數(shù)在每次調(diào)用時(shí)都有一個(gè)不同的作用域。這意味著同名變量可以用在不同的函數(shù)中。因?yàn)檫@些變量綁定在不同的函數(shù)中,擁有不同作用域,彼此之間不能訪問(wèn)。(在一個(gè)函數(shù)顳部定義的函數(shù)或者用var定義的變量具有局部作用域)
Eg:
在ES5中函數(shù)去區(qū)分全局和局部的唯一的代碼塊
if(true){
var a = 10;
}
for(var i =0; i<=0; i++){
var b = 10;
}
console.log(a,b);//a,b都是輸出10
函數(shù)的形參具有局部作用域,是局部變量
function foo(x){
console.log(x);//輸出undefined
}
foo();
console.log(x);//報(bào)錯(cuò)
補(bǔ)充一點(diǎn)塊語(yǔ)句
塊級(jí)聲明包括if和switch,以及for和while循環(huán),和函數(shù)不同,它們不會(huì)創(chuàng)建新的作用域。在塊級(jí)聲明中定義的變量從屬于該塊所在的作用域。
Eg:
if(true){
Var name = “join”;
}
Console.log(name)//輸出join
Es6中引用了let,const關(guān)鍵字,這些關(guān)鍵字可以代替var,但是和var不同的是,let和const具有塊級(jí)作用域,也就是說(shuō)在塊級(jí)聲明中創(chuàng)建并使用時(shí),是具有全局作用域的
在全局作用域聲明的變量可以稱為全局變量,同理還有全局變量,和函數(shù)形參,他們所站的比重是局部變量>函數(shù)形參>全局變量