> [带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作用域链以及全局变量和局部变量的更多相关文章

  1. js作用域链

    js作用域链 <script> var up = 555; function display(){ var innerVar = 2; function inner(){ var inne ...

  2. 针对JS经典题型对全局变量及局部变量的理解浅谈

    第一次写博,还蛮激动... 看到了三题经典题型,就我目前的认识对此题进行总结.如有错误,敬请指正 首先,我们先明确一下JS引擎的工作步骤: js引擎工作分为两步: 1.将这个js中的变量和函数声明保存 ...

  3. Js作用域链及变量作用域

    要理解变量的作用域范围就得先理解作用域链 用var关键字声明一个变量时,就是为该变量所在的对象添加了一个属性. 作用域链:由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是 ...

  4. js 作用域链&内存回收&变量&闭包

    闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等 一.作用域链:函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在 ...

  5. js作用域链和预编译

    js引擎运行分为两步,预解析 代码执行 (1)预解析: js引擎会拿js里面所有的var还有 function 提升到当前作用域的最前面 (2)代码执行:按照代码书写的顺序从上往下执行 预解析分为:变 ...

  6. [js]作用域链查找规则获取值和设置值

    作用域链查找规则获取值和设置值 <script> /** 1.作用域链查找规则 私有作用域出现的一个变量不是私有的,则往上一级作用域查找,上级作用域没有则继续向上级查找,一直找到windo ...

  7. 【动画演示】:JS 作用域链不在话下

    作者:Lydia Hallie译者:前端小智来源:dev 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类, ...

  8. 关于js作用域链,以及闭包中的坑

    eg:链式作用域,想在外部读取blogName的值得方法 <script>var authorName="山边小溪";function doSomething(){   ...

  9. js作用域链与this

    this的绑定与function和对象的定义位置无关,是由函数调用时的执行环境所决定的. scope chain是由函数定义时的位置决定的与函数调用时的执行环境无关.

随机推荐

  1. JDK7 AutoCloseable

    干嘛的 直接看JDK7的流(运用了AutoCloseable)源码 public abstract class InputStream implements Closeable { //实现Close ...

  2. [Xamarin.Android] 結合Windows Azure與Google cloud message 來實現Push Notification (转帖)

    這一篇要討論如何使用Xamarin.Android 整合GCM以及Windows Azure來實作Android手機上的推播通知服務. 這篇文章比較著重概念的部分,在開始讀這篇之前,也可以先參考一下X ...

  3. MySQL中show语法

    1. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称. 2. show databases; -- 显示mysql中所有数据 ...

  4. linux 安装php bz2扩展

    折腾了半天,最大的坑就是我是用lnmp一键安装php环境,php7下面没有ext文件夹,有个include下面虽然有个ext 但是里面没有需要的bz2 也尝试去pecl  和 pear 上面去找  无 ...

  5. vuex requires a Promise polyfill in this browser

    ie 浏览器访问 vue 项目(使用的vuex 状态管理组件)报错:vuex requires a Promise polyfill in this browser 处理办法: 1.npm insta ...

  6. PHP之mb_strpos使用

    mb_strpos (PHP 4 >= 4.0.6, PHP 5, PHP 7) mb_strpos - Find position of first occurrence of string ...

  7. java的文件操作类File

    java.io.File类,是java获取文件/文件夹的所有属性,和完成所有相关操作的类 例子: package test.file.IO; import java.io.*; public clas ...

  8. Tomcat开发Comet要点

    Comet技术的悄然流行,Jetty在比较早地支持了Comet,提供了Comet 的Servlet,同样从Tomcat6开始,Comet已经在Tomcat的标准Servlet中开始支持了,这是个好事情 ...

  9. CentOS VNC

    CentOS Linux:1.需要安装的包:tigervnc,tigervnc-server 2.配置显示分辨率.桌面和用户:编辑 /etc/sysconfig/vncservers参考注释掉的最后两 ...

  10. 设置主外键时 ORA-02298: 无法验证 - 未找到父项关键字 --NOVALIDATE;

    主要原因是: 在添加CONSTRAINT的时候,默认是需要VALIDATE表中的已有数据的. 你要插入的表A里,有外键连接到另一个表B的主键,你在表A的外键列插入的值,在表B的主键列找不到就不能插入. ...