作用域
作用域:變量可以起作用的范圍
全局變量和局部變量
不使用var聲明的變量是全局變量,不推薦使用。 變量退出作用域之后會銷毀,全局變量關(guān)閉網(wǎng)頁或瀏覽器才會銷毀
塊級作用域
任何一對花括號({和})中的語句集都屬于一個塊,在這之中定義的所有變量在代碼塊外都是不可見的,我們稱之為塊級作用域。
在es5之前沒有塊級作用域的的概念,只有函數(shù)作用域,現(xiàn)階段可以認為JavaScript沒有塊級作用域
詞法作用域
變量的作用域是在定義時決定而不是執(zhí)行時決定,也就是說詞法作用域取決于源碼,通過靜態(tài)分析就能確定,因此詞法作用域也叫做靜態(tài)作用域。
在 js 中詞法作用域規(guī)則:
- 函數(shù)允許訪問函數(shù)外的數(shù)據(jù).
- 整個代碼結(jié)構(gòu)中只有函數(shù)可以限定作用域.
- 作用域規(guī)則首先使用提升規(guī)則分析
- 如果當前作用規(guī)則中有名字了, 就不考慮外面的名字
var num = 123;
function foo() {
console.log( num );
}
foo();
if ( false ) {
var num = 123;
}
console.log( num ); // undefiend
作用域鏈
只有函數(shù)可以制造作用域結(jié)構(gòu), 那么只要是代碼,就至少有一個作用域, 即全局作用域。凡是代碼中有函數(shù),那么這個函數(shù)就構(gòu)成另一個作用域。如果函數(shù)中還有函數(shù),那么在這個作用域中就又可以誕生一個作用域。
將這樣的所有的作用域列出來,可以有一個結(jié)構(gòu): 函數(shù)內(nèi)指向函數(shù)外的鏈式結(jié)構(gòu)。就稱作作用域鏈。
// 案例1:
function f1() {
function f2() {
}
}
var num = 456;
function f3() {
function f4() {
}
}
// 案例2
function f1() {
var num = 123;
function f2() {
console.log( num );
}
f2();
}
var num = 456;
f1();
代碼示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>$永遠的24k純帥$</title>
<script>
var num=10;
function f1() {
var num=20;
function f2() {
var num=30;
function f3() {
//var num=50;
console.log(num);
}
f3();
}
f2();
}
f1();
</script>
</head>
<body>
</body>
</html>
總結(jié)
* 全局變量:聲明的變量是使用var聲明的,那么這個變量就是全局變量,全局變量可以在頁面的任何位置使用
* 除了函數(shù)以外,其他的任何位置定義的變量都是全局變量
* 局部變量:在函數(shù)內(nèi)部定義的變量,是局部變量,外面不能使用
* 全局變量,如果頁面不關(guān)閉,那么就不會釋放,就會占空間,消耗內(nèi)存
*
* 全局作用域:全局變量的使用范圍
* 局部作用域:局部變量的使用范圍
*
* 塊級作用域:一對大括號就可以看成是一塊,在這塊區(qū)域中定義的變量,只能在這個區(qū)域中使用,但是在js中在這個塊級作用域中定義的變量,外面也能使用;
* 說明:js沒有塊級作用域,只有函數(shù)除外
*
* 隱式全局變量:聲明的變量沒有var,就叫隱式全局變量
* 全局變量是不能被刪除的,隱式全局變量是可以被刪除的
* 定義變量使用var是不會被刪除的,沒有var是可以刪除的