js作用域链以及全局变量和局部变量

> [带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
```
posted @ 2018-10-28 15:08  kpengfang  阅读(460)  评论(0编辑  收藏  举报