> [带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. Mac 10.12安装粘贴板增加工具ClipMenu

    说明:这个工具可以保留复制过的记录,并且可以快速调出之前复制过的内容,最开发时比较常用,支持图片等. 下载: (链接: https://pan.baidu.com/s/1qXJbM2o 密码: wef ...

  2. Mac下安装eclipse(Mac 10.12/JDK/tomcat)

    1.到官网https://www.eclipse.org/downloads/eclipse-packages/下载安装包 2.安装 注意:安装ecllipse时一定要安装JDK先,最新版本的ecli ...

  3. Python3 print()函数sep,end,file参数用法练习

    来自builtins.py:def print(self, *args, sep=' ', end='\n', file=None): # known special case of print &q ...

  4. Jmeter创建一个点对点的 JMS 测试计划

    创建一个点对点的 JMS 测试计划 确保所需的jar文件位于JMeter lib目录中. 如果没有,关闭JMeter,复制jar文件并重新启动JMeter. 参见详细教程 在本节中,将学习如何创建测试 ...

  5. cocos2d-x中描述精灵帧图片的plist和json文件各个key的含义

    最近在研究cocos,互联网行业中,手游业最近的表现是非常的火,加上本身对游戏有浓厚兴趣,所以便染指了游戏引擎~ 这次的废话就这么简短吧,因为这次记录的东西本身就很少. 在cocos中,为精灵帧添加缓 ...

  6. PHP代码实现强制换行

    1. 简单的,只能分2行: //$str:输入字符串: //$num:超过多少个字符后进行换行(换行后每行的最大字符数) function forceBlackString($str, $num){ ...

  7. *2.2.3 加入objection机制

    在上一节中,虽然输出了“main_phase is called”,但是“data is drived”并没有输出.而main_phase是一个完整的任务,没有理由只执行第一句,而后面的代码不执行.看 ...

  8. 前端自动化Gulp工具常用插件

    npm init命令初始化当前文件夹后,在当前文件夹新建gulpfile.js文件.当前目录下的所有操作流都在gulpfile.js文件中定义. gulp自动化 gulp-uglify (JS压缩) ...

  9. [转].Net Windows服务安装完成后自动启动

    本文转自:http://www.cnblogs.com/hb_cattle/archive/2011/12/04/2275319.html 考虑到部署方便,我们一般都会将C#写的Windows服务制作 ...

  10. 注解完成spring json返回数据格式配置

    import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.module.Simp ...