### 不管条件是否成立都要进行变量提升
> 不管条件是否成立,判断体中出现的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. [转] flume使用(六):后台启动及日志查看

    [From] https://blog.csdn.net/maoyuanming0806/article/details/80807087 处理的问题flume 普通方式启动会有自己自动停掉的问题,这 ...

  2. hzjs颠覆jquery,按照中国人思维开发的最简洁的JQUERY替代品更简洁更高效

    颠覆jquery,按照中国人思维开发的最简洁的JQUERY替代品 实现了类似JQUERY的选择器最核心的基本功能 如:$('#image2').attr("src") 另外提供了 ...

  3. 网站安全系列:跨站脚本攻击XSS

    本篇博文主要从概念和应用上介绍XSS,主要内容来源于<白帽子讲web安全> XSS核心本质 XSS实际上是一种HTML注入,用户输入的数据被当成HTML的一部分来执行.防御方法核心是输入检 ...

  4. jmeter笔记

    Jmeter性能测试 入门 Jmeter 录制脚本:使用一个叫badbody的工具录制脚步供jmeter使用,http://www.badboy.com.au/:也可以用jmeter来录制 Jmete ...

  5. eclipse自定义代码注释

    效果如下: 自定义注释的方法:

  6. Android对敏感数据进行MD5加密(基础回顾)

    1.在工具类的包下新建一个进行md5加密的工具类MD5Utils.java package com.example.mobilesafe.utils; import java.security.Mes ...

  7. cors允许的方法和contype-type

    https://fetch.spec.whatwg.org/#cors-safelisted-request-header get head post text/plain multipart/for ...

  8. css3圆形轨迹动画

    <!doctype html>      <html lang="en">      <head>          <meta char ...

  9. 关于chrome下的bug

    最近看了大神的一篇文章,于是尝试了一下里面说的bug以及修复 1.Chrome下absolute绝对定位元素部分display属性值不渲染bug 首先还原一下bug.. ff下的下效果 点击按钮后的效 ...

  10. 关系型数据库MySQL多实例

    简介 MySQL数据库是一个中小型关系型数据库管理系统,软件开发者为瑞典MySQL AB公司.在2008年1月16号被Sun公司收购后Sun公司又被oracle公司收购.目前MySQL被广泛地应用在I ...