1. 程式人生 > >js作用域鏈以及全局變量和局部變量

js作用域鏈以及全局變量和局部變量

全局對象 作用 efi ren inter java tin 繼續 如果

> [帶var] > 在當前作用於中聲明了一個變量,如果當前是全局作用域,也相當於給全局作用域設置了一個屬性叫做a ```javascript //=>變量提升:var a; <=>window.a=undefined; console.log(a);//undefined var a = 12; console.log(a);//12 console.log(window.a);//window[‘a‘]在‘全局作用域’中,我們聲明了一個變量,相當於全局對象window增加了一個屬性名 ```
> [不帶var] > 在全局作用域中,如果不帶var,僅僅是給全局對象設置了一個新的屬性名(把window.省略了) ```javascript // console.log(a);//=>Uncaught ReferenceError: a is not defined a = 12;//<=>window.a=12 console.log(a);//=>12 console.log(window.a);//=>12 ```
window.setInterval();//window.可以省略 window.document.getElementById();//window.可以省略
> 項目中,如果你的目的是創建變量,最好不要省略var,這樣會嚴謹一些
### 作用域鏈 > 函數執行形成一個私有的作用域(保護私有變量),進入到私有作用域中,首先變量提升(聲明過的變量是私有的),接下來代碼執行 > 1、執行的時候遇到一個變量,如果這個變量是私有的,那麽按照私有變量處理即可; ```javascript function fn() { //=>私有作用域 //變量提升:var a;(私有變量) console.log(a);//->undefined var a = 12; console.log(a);//->12 } fn(); console.log(a);//->Uncaught ReferenceError: a is not defined 閉包機制:私有作用域保護裏面的私有變量不收外界的幹擾不收外界的幹擾
``` > 2、如果當前這個變量不是私有的,我們需要向它的上級作用域進行查找,上級如果也沒有,則繼續向上查找,一直找到window全局作用域為止,我們把這種查找機制叫做**`作用域鏈`** > 1)如果上級作用域有,我們當前操作的都是上級作用域中的變量(假如我們在當前作用域把值改了,相當於把上級作用域中的這個值給修改了) > 2)如果上級作用域中沒有這個變量(找到window也沒有); > 變量 = 值:相當於給window設置了一個屬性,以後再操作window下就有了 例子: //=>變量提升:var x;var y; fn=>aaafff111 console.log(x, y); var x = 10, y = 20; function fn() { //=>[私有作用域] //=>變量提升:var x;(x是私有變量) console.log(x, y);//=>undefined 20 var x = y = 100;//=>x=100(私有)y=>100(全局) console.log(x, y);//=>100 100 } fn(); console.log(x, y);//=>10 100 結果: undefined undefined undefined 20 100 100 10 100 註意事項:
// var x = 10,y=10;等同於 var x = 10;var y =10;
// var x = y = 100; // var x = 100;(私有) // y = 100;//->此處的y是不帶var的(全局)

```javascript function fn(){ a = 12; console.log(a);//->12 } fn(); console.log(a);//->12 ```

js作用域鏈以及全局變量和局部變量