### 不管条件是否成立都要进行变量提升
> 不管条件是否成立,判断体中出现的var/function都会进行变量提升;但是在最新浏览器版本当中,function声明的变量只能提前声明,不能定义了(前提:函数是在判断体重)。
```javascript
// 不管条件是否成立都要进行变量提升
console.log(num);//=>undefined
console.log(fn);//=>undefined
if (1 == 1) {
var num = 12;
function fn() {
}
}
```
> 代码执行到条件判断地方
> [条件不成立]
> 进入不到判断体中,此时之前声明的变量或者函数依然是undefined
> [条件成立]
> 进入条件判断体中的第一件事情不是代码执行,而是把之前变量提升没有定义的函数首先定义了(进入到判断体中函数就定义了,迎合ES6中的块级作用域)。
```javascript
// 不管条件是否成立都要进行变量提升
console.log(num);//=>undefined
console.log(fn);//=>undefined
if (1 == 1) {
console.log(num);//=>undefined
console.log(fn);//=>函数本身---此处条件成立,先把变量提升没定义的函数首先定义了
var num = 12;
function fn() {
}
console.log(num);//=>12
console.log(fn);//=>函数本身
}
```
> 老版本浏览器不是这样处理的:不管条件是否成立,都要进行变量提升(和新版本不一样的地方,新版本function只是声明,老版本function依然是声明+定义)
```javascript
//=>var function 没有提升变量
f = function () {
return true;
}
g = function () {
return false;
}
~function () {
//=>[私有作用域]
//变量提升:g=undefined新浏览器不管条件是否成立,都进行变量提升,只对函数进行声明
//![]false []==![]//=>true true&&true
if (g() && [] == ![]) {//=> Uncaught TypeError: g is not a function
f = function () {//
return false;
};
function g() {
return true;
}
}
}();
console.log(f());
console.log(g());
//新浏览器下 g is not a function
//老浏览器下 false false 273行的f是全局的,把全局修改为了false,276的g是私有作用域,跟全局没有影响,所以还是false
```

js不管条件是否成立都要进行变量提升的更多相关文章

  1. 2 —— js语法 —— 对象和方法的声明 。变量提升。闭包

    一,声明对象 var obj1 = {}; var obj2 = {name:'kk',age:18,fun:function{          // name,age,fun为对象的属性,只是属性 ...

  2. JS中的 变量提升

    首先纠正下,文章标题里的 “变量提升” 名词是随大流叫法,“变量提升” 改为 “标识符提升” 更准确.因为变量一般指使用 var 声明的标识符,JS 里使用 function 声明的标识符也存在提升( ...

  3. JS高级——变量提升

    JS执行过程 1.首先是预解析:预解析过程最重要的是提升,在JavaScript代码在预解析阶段,会对以var声明的变量名,和function开头的语句块,进行提升操作 2.执行操作 全局中解析和执行 ...

  4. js 1.变量提升 2.条件语句 3.循环语句 4.加号+的使用

    1.变量提升 变量提升是浏览器的一个功能,在运行js 代码执行前,浏览器会给js一个全局作用域叫 window,window 分两个模块,一个叫运营模块,内存模块找到当前作用域下的所有带var和fun ...

  5. Shell [[]]详解:检测某个条件是否成立

    [[ ]]是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立. test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好:test 做不到的,[[ ]] 还能 ...

  6. js基础--javaScript数据类型你都弄明白了吗?绝对干货

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 数据类型的分类 JavaScript的数据类型分为两大类,基本数据类型和复杂数据类型. 基本数据类型:Null.Undefine ...

  7. js多条件if语句简写发生Uncaught SyntaxError: Unexpected token }

    改写原生js 多条件if判断语句时,采用三元方法,发生Uncaught SyntaxError: Unexpected token } function compareImgSize() { var ...

  8. Vue.js:条件与循环

    ylbtech-Vue.js:条件与循环 1.返回顶部 1. Vue.js 条件与循环 条件判断 v-if 条件判断使用 v-if 指令: v-if 指令 在元素 和 template 中使用 v-i ...

  9. [js]变量提升-关于条件

    条件函数变量提示于全局中函数变量提升不一样. 条件中: 函数变量提升, 只是声明(现新版本浏览器中) if(g()){ function g() { return true } console.log ...

随机推荐

  1. pyserial timeout=1 || timeout=0.01

    昨天在做串口通信时候发现,串口参数(timeout=1 || timeout=0.01)对通信的读数据竟然影响很大,代码如下: self.ser = serial.Serial(port=serial ...

  2. HttpContext.Current.Session.Abandon() 大坑 要注意

    HttpContext.Current.Session.Abandon(); 如果在调用以上代码之后再存储session 在当前上下文之内是可以访问session的.. 但是页面跳转之后..在其他页面 ...

  3. (转)QEMU 使用的镜像文件:qcow2 与 raw

    原文:https://www.ibm.com/developerworks/cn/linux/1409_qiaoly_qemuimgages/ qcow2 的基本原理 qcow2 镜像格式是 QEMU ...

  4. Java集合类中的Iterator和ListIterator的区别

    注意:内容来自网络他人文章! 最近看到集合类,知道凡是实现了Collection接口的集合类,都有一个Iterator方法,用于返回一个实现了Iterator接口的对象,用于遍历集合:(Iterato ...

  5. ActiveMQ:Exception occurred while processing this request, check the log for more information!

    出现上面错误的原因有以下两种 1 jdk的版本和activemq的版本不符 安装完ActiveMQ之后,通过http://IP:8161登陆到控制台. 通过测试代码给服务端发送队列消息,在控制台点击q ...

  6. Hadoop Gateway 部署

    1.集群的 hadoop-current hive-current spark-current copy 到 gateway 机器 2.集群的 hadoop-conf       hive-conf ...

  7. ruby gems列表

    https://github.com/shageman/cobradeps

  8. "Visual Studio Code is unable to watch for file changes in this large workspace"

    https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-chang ...

  9. WindowsServer2008安装IIS相关服务

    控制面板->程序->打开或关闭Windows功能 添加角色,选择IIS服务器,选择以下角色服务,如果添加过就选择添加角色服务 如果出现500错误,这个跟程序没有多大关系,可以试一下以下操作 ...

  10. java数据结构---------插入排序的实现

    插入排序分为直接插入排序和希尔排序 插入排序 实现方法 //插入排序,按从小到大的顺序 public static void insertSort(int[] array){ int j,temp = ...