作用域(Scope)的概念
作用域指一個變數的作用范圍,在js中,一共有兩種作用域,
- 全域作用域,
- 函式作用域,
全域作用域
直接撰寫在script標簽中的JS代碼,
- 全域作用域在頁面打開時創建,在頁面關閉時銷毀,
- 在全域作用域中有一個全域變數Window,它代表的是一個瀏覽器的視窗,它由瀏覽器創建我們可以直接使用,
在全域作用域中: - 創建的變數都會作為window物件的屬性保存,
- 創建的函式都會作為window的方法保存,
全域作用域中的變數都是全域變數,在頁面的任意部分都可以訪問的到,
變數的宣告提前(變數提升)
使用var關鍵字宣告的變數(比如 var a = 1),會在所有代碼執行之前被宣告(但是不會被賦值),但是如果宣告變數時不是var關鍵字(比如直接寫 a = 1),則變數不會被宣告提前,
舉例:
console.log(a);
var a =1;
列印結果:

列印結果是undefined,(說明變數a被提前宣告了,只是尚未被賦值)
函式的宣告提前
函式宣告
使用函式宣告的形式創建的函式 function foo(),會被宣告提前,
也就是說,整個函式會在所有的代碼執行之前就被創建完成,所以我們可以在函式宣告之前,呼叫函式,
代碼舉例:
fn1();
function fn1(){
document.write("我是函式 fn1");
}
列印結果

函式運算式
使用函式運算式創建的函式var foo = function(){},不會被提前宣告,所以不能在宣告前呼叫,因為此時foo被宣告了,且為undefined,并沒有把function()賦值給 foo,
作用域
作用域:變數和函式生效的區域,作用域在函式定義時,就已經確定了,
在函式作用域中訪問到全域作用域的變數,在全域作用域中無法訪問到函式作用域的變數,
執行期背景關系:當函式執行時,會創建一個執行期背景關系的內部物件,每呼叫一次函式,就會創建你一個新的背景關系物件,他們之間是相互獨立的,當函式執行完畢,它所產生的執行期背景關系會被銷毀,
(但是當函式內部的變數被另外一個函式所參考,那么這個函式的變數不會被銷毀)
作用域的上下級關系:
當在函式作用域操作一個變數時,它會先在自身作用域中尋找,如果有就直接使用(就近原則),如果沒有則向上一級作用域中尋找,直到找到全域作用域;如果全域作用域中依然沒有找到,則會報錯ReferenceError,
在函式中要訪問全域變數可以使用window物件,(比如說,全域作用域和函式作用域都定義了變數a,如果想訪問全域變數,可以使用window.a)
提醒1:
在函式作用域也有宣告提前的特征:
- 使用var關鍵字宣告的變數,會在函式在所有的代碼執行之前被宣告
- 函式宣告也會在函式中所有的代碼執行之前執行
因此,在函式中,沒有var宣告的變數都是全域變數,而且并不會提前宣告,
舉例:
var a = 1;
function foo(){
console.log(a);
a = 2; //此處的a相當于window.a,自動宣告為全域變數
}
foo();
console.log(a); //列印結果是2
列印結果:
上面代碼中,foo()的列印結果是1,如果去掉第一行代碼,列印結果是
提醒2:定義形參就相當于在函式作用域中宣告了變數,
例如;
function fun6(e){//這個函式因為有了形參e,此時就相當于在函式的內部的第一行代碼里面寫了 var e;
console.log(e);
}
fun6();//列印結果為 undefined;
fun6(123);//列印結果為123;
列印結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/272501.html
標籤:其他
上一篇:Cocos2dx-c++雜記
下一篇:jQuery
