最通俗易懂的javascript变量提升详解


Posted in Javascript onAugust 05, 2017

如下所示:

a = 'ghostwu';
var a;
console.log( a );

在我没有讲什么是变量提升,以及变量提升的规则之前, 或者你没有学习过变量提升,如果按照现有的javascript理解, 对于上述的例子,你可能会认为第3行代码的输出结果应该是undefined, 因为第二行是var a; 声明变量,但是没有赋值,所以a的值是undefined, 但是正确的结果是ghostwu. 至于为什么,请继续往下看!

console.log( a );
var a = 'ghostwu';

对于上面这个例子,第一行代码,你可能认为报错, 因为在输出a之前,没有定义a变量, 但是正确的结果是undefined. 嗯,好像有点莫名奇妙,javascript太bug了.

要搞清楚为什么,首先我们要明确以下2点:

javascript代码并不是一行一行往下执行的.

javascript执行分为2个步骤:

编译(词法解释/预解释)

执行

其次,当我们碰到 var a = "ghostwu" 定义一个变量的时候, 其实js把这句话看成是2个阶段的事, var a 发生在编译阶段, a = 'ghostwu'发生在执行阶段. 然后 var a会被提升到当前作用域的最前面, a = 'ghostwu'留在原地等待执行阶段,所以:

a = 'ghostwu';
var a;
console.log( a );

//上面这段代码经过编译之后,变成下面这样

var a; //被提升到当前作用域的最前面
a = 'ghostwu'; //留在原地,等待执行
console.log( a );
console.log( a ); 
var a = 'ghostwu';

//上面这段代码,经过编译之后,变成下面这样

var a;
console.log( a );
a = 'ghostwu';

看完编译后的代码,你明白了吗?

在接着讲下面之前,我们先明确函数常见的2种定义方式:

//函数声明, 形如:
  function show(){
   console.log( '函数声明方式' );
  }

  //函数表达式, 形如:
  var show = function(){
   console.log( '表达式方式' );
  }

因为表达式和函数声明,在编译阶段,会产生不同的解释效果。

show();
  function show(){
   console.log( a );
   var a = 'ghostwu';
  }

对于上面这段代码,会在编译阶段,如何解释呢?记住下面这句话就行了:

函数声明会被提升

所以,上面的代码,经过编译之后,就变成了下面这样:

function show(){ //函数声明被提升到 当前作用域的最前面
   var a; //var声明被提升到当前作用域的最前面, 注意,他不会提升到函数的外面, 因为当前的作用域是在函数中
   console.log( a );
   a = 'ghostwu';
  }
  show();

所以,上面的结果就是undefined;

对于函数表达式,是不会提升的, 看下面的例子:

show(); //报错,show is not a function
var show = function(){
 console.log( 'ghostwu' );
}
//对于上面这段表达式代码,经过编译之后:
var show;
show(); //执行之后就是 undefined(), 所以在表达式定义之前,调用函数报错了
show = function(){
 console.log( 'ghostwu' ); 
}
show(); //你好
  var show;
  function show(){
   console.log( '你好' );
  }
  show = function(){
   console.log( 'hello' );
  }

上面这段代码,结果为什么会是 '你好'?

因为: 当出现同名的函数声明,变量声明的时候, 函数声明会被优先提升,变量声明会被忽略。 所以经过编译之后,就变成:

function show(){
   console.log( '你好' );
  }
  show(); //你好
  show = function(){
   console.log( 'hello' );
  }
  show();//如果这里在调用一次,就是hello, 因为show函数体在执行阶段 被 重新赋值了

如果有同名的函数声明,后面的会覆盖前面的,如下:

show(); //how are you
  var show;
  function show(){
   console.log( 'hello' );
  } 
  show = function(){
   console.log( '你好' );
  }
  function show(){
   console.log( 'how are you!' );
  }
//上面的代码经过编译之后,变成如下形式:
  function show(){
   console.log( 'how are you!' );
  }
  show(); //how are you
  show = function(){
   console.log( '你好' );
  }
  show(); //如果在这里再执行一次,结果:你好
//思考题: 请问下面的结果是什么? 为什么? 写下你的答案
   show();
   var a = true;
   if( a ){
    function show(){
     console.log( 1 );
    }
   }else {
    function show(){
     console.log( 2 );
   }
   }

以上这篇最通俗易懂的javascript变量提升详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
High Performance JavaScript(高性能JavaScript)读书笔记分析
May 05 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
Apr 02 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
js进行表单验证实例分析
Feb 10 Javascript
JS实现窗口加载时模拟鼠标移动的方法
Jun 03 Javascript
用JavaScript实现让浏览器停止载入页面的方法
Jan 19 Javascript
BOM之navigator对象和用户代理检测
Feb 10 Javascript
详解react-native-fs插件的使用以及遇到的坑
Sep 12 Javascript
微信小程序canvas截取任意形状的实现代码
Jan 13 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
Mar 03 Javascript
vue实现可拖拽的dialog弹框
May 13 Vue.js
javascript实现计算器功能详解流程
Nov 01 Javascript
Vue2.0 vue-source jsonp 跨域请求
Aug 04 #Javascript
js分页之前端代码实现和请求处理
Aug 04 #Javascript
微信小程序 rich-text的使用方法
Aug 04 #Javascript
Easyui和zTree两种方式分别实现树形下拉框
Aug 04 #Javascript
JS中使用media实现响应式布局
Aug 04 #Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
Aug 04 #Javascript
node中Express 动态设置端口的方法
Aug 04 #Javascript
You might like
php AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
PHPThumb图片处理实例
2014/05/03 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
python如何求解两数的最大公约数
2018/09/27 Python
使用Python函数进行模块化的实现
2019/11/15 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
Python 求数组局部最大值的实例
2019/11/26 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
网络方面基础面试题
2012/11/16 面试题
Python面试题:Python是如何进行内存管理的
2014/08/04 面试题
玩具公司的创业计划书
2013/12/31 职场文书
年终考核评语
2014/01/19 职场文书
求职信结尾怎么写
2014/05/26 职场文书
十佳青年事迹材料
2014/08/21 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
2019公司管理制度
2019/04/19 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
Python实现制作销售数据可视化看板详解
2021/11/27 Python