JS中的變量作用域(console版)
作用域說明:指一個變量的作用范圍
1.全局作用域
(1) 全局作用域在頁面打開時被創(chuàng)建,頁面關閉時被銷毀
(2) 編寫在script標簽中的變量和函數,作用域為全局,在頁面的任意位置都可以訪問到
(3) 在全局作用域中有全局對象window,代表一個瀏覽器窗口,由瀏覽器創(chuàng)建,可以直接調用
(4) 全局作用域中聲明的變量和函數會作為window對象的屬性和方法保存
var a = 10;
b = 20;
function an(){
console.log('an')
}
var bn = function(){
console.log('bn')
}
console.log(window)
如圖,變量a,b和函數an,bn都保存在window對象上

(5) window對象的屬性和方法可以直接調用,如window.an() 可以寫為 an()
2.函數作用域:
(1) 調用函數時,函數作用域被創(chuàng)建,函數執(zhí)行完畢,函數作用域被銷毀
function an(){
var s = 'an'
console.log(s);
}
//an();
此時函數an并沒有執(zhí)行,作用域沒有創(chuàng)建,當函數執(zhí)行時,作用域創(chuàng)建,輸出結果an
an();

(2) 每調用一次函數就會創(chuàng)建一個新的函數作用域,他們之間是相互獨立的
(3) 在函數作用域中可以訪問到全局作用域的變量,在函數外無法訪問到函數作用域內的變量
function an(){
var s = 'an'
console.log(s);
}
an();
console.log(s); // 此時,程序會從當前作用域和上級作用域及以上作用域中尋找變量s,并不會去下級作用域中尋找

(4) 在函數作用域中訪問變量、函數時,會先在自身作用域中尋找,若沒有找到,則會到函數的上一級作用域中尋找,一直到全局作用域
(5) 在函數作用域中也有聲明提前的特性,對于變量和函數都起作用,此時函數作用域相當于一個小的全局作用域,詳細聲明提前請看聲明提前部分
an();
bn();
function an(){
var s = 'an'
console.log(s);
}
var bn = function(){
console.log('bn')
}
下圖就結果中,an()可以正常執(zhí)行,函數an()提升并創(chuàng)建了,函數bn的變量名提升了,但是為賦值,此時bn不是函數

(6) 在函數作用域中,不使用變量關鍵字聲明的變量,在賦值時會往上一級作用域尋找已經聲明的同名變量,直到全局作用域時還沒找到,則會成為window的屬性
an(); // 輸出結果 bn
function an(){
var b = 'bn';
function bn(){
console.log(b);
b = 'bn2'; // b會往上一級尋找已經聲明的同名變量,并賦值,直到全局作用域時還沒找到,則會成為window的屬性
}
bn();
console.log(b); // 輸出 bn2
}
(7) 在函數中定義形參,等同于聲明變量
function an(name){
console.log(name); // 輸出 undefined
}
an();
等同于
function an(){
var name
console.log(name); // 輸出 undefined
}
an();
到此這篇關于JS中作用域以及變量范圍的文章就介紹到這了,更多相關JS作用域內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

