JavaScript进阶(一)变量声明提升实例分析


Posted in Javascript onMay 09, 2020

本文实例讲述了JavaScript变量声明提升。分享给大家供大家参考,具体如下:

JavaScript进阶(一)变量声明提升实例分析

如下代码输出的结果是?

var num = 123;
function foo1(){
 console.log( num ); //undefined
 var num = 456;
 console.log( num ); //456
}
foo1();

Javascript代码执行分为两个大步:

预解析的过程
代码的执行过程

1.预解析与变量声明提升

程序在执行过程中,会先将代码读取到内存中检查,会将所有的声明在此进行标记,所谓的标记就是让JS解析器知道有这个名字,后面在使用名字的时候不会出现未定义的错误。这个标记过程就是提升。

声明:

名字的声明,标识符声明(变量名声明)

  • 名字的声明就是让解析器知道有这个名字
  • 名字没有任何数据与之对应

函数的声明

  • 函数声明包含两部分
  • 函数声明与函数表达式有区别,函数声明是单独写在一个结构中,不存在任何语句,逻辑判断等结构中

    function f() {}
    function func() { // 函数声明
    } 
    if ( true ) {
     function func2 () {} //函数表达式
    }
    var f = function func3 () {}; //函数表达式
    this.sayHello = function () {}; //函数表达式
    var i= 1;
    function func4 () {} // 函数声明
     var j = 2;
    }

首先函数声明告诉解析器有这个名字存在,该阶段与名字声明一样
告诉解析器,这个名字对应的函数体是什么

var num = 1;
function num () {
 alert( num );
}
num(); // 报错

分析

  1. 预解析代码,提示名字

    • 首先提升名字num
    • 再提升函数名,但是名字已经存在,因此只做第二部,让名字与函数体对应上
    • 结论就是 代码中已经有一个函数 num 了
  2. 开始执行代码,第一句话从赋值语句开始执行

    • 给num赋值为1
    • 覆盖了函数
  3. 调用num,由于num中存储的是数组1,因此报错

2.代码分析举例

程序1

var num = 123;
function foo1(){
 console.log( num ); //undefined
 var num = 456;
 console.log( num ); //456
}
foo1();
  1. 预解析,提升 num 名字和 foo1 函数
  2. 执行第一句话:num = 123;
  3. 执行函数调用

    • 函数调用进入函数的一瞬间也要进行预解析,此时解析的是变量名 num
    • 在函数内部是一个独立的空间,允许使用外部的数据,但是现在 num 声明同名,即覆盖外面的
    • 执行第一句 打印num,没有数据,undefined
    • 执行第二句 赋值:num = 456;
    • 执行第三句 打印num,结果456

程序2

if ( ! 'a' in window ) {
 var a = 123;
}
console.log( a );

首先,预解析,读取提升 a ,有一个名字 a 存在了

其次,in 运算符:判断某一个字符串描述的属性名是否在对象中

  • var o = { name:'jim' }; 'name' in o,'age' in o
  • 执行第一个判断:! 'a' in window

    • 'a' in window 结果为真
    • !得到假
  • if内部的赋值不进行

最后,打印结果 a 的值为 undefined

程序3

if ( false ) {
 function f1 () {
  console.log( 'true' );
  }
} else {
 function f1 () {
  console.log( 'false' );
  }
}
f1();

预解析:提升 f1 函数,只保留提升后的内容,所以打印是 false

执行代码,第一句话就是一个空的if结构

if ( true ) {
} else {
}

执行函数调用,得到 false

3.问题

function foo () } {}
var foo = function () {};

上面的语法是声明,可以提升,因此在函数上方也可以调用

下面的语法是函数表达式,函数名就是foo ,他会提升,提升的不是函数体

函数表达式也是支持名字语法

var foo = function func1 () {};
func();

函数有一个属性name,表示的是函数名,只有带有名字的函数定义,才会有name属性值,否则是“”

  • 但是,函数表达式的名字,只允许在函数内部使用,IE8可以访问
  • ()可以将数据转化为表达式

新的浏览器中,写在if、while、do..while结构中的函数,都会将函数的声明转换成特殊的函数表达式
将代码

if (...) {
 function foo () { ... }
}

转换成

if (...) {
 var foo = function foo () { .... }
}

完。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
可实现多表单提交的javascript函数
Aug 01 Javascript
Javascript typeof 用法
Dec 28 Javascript
js去空格技巧分别去字符串前后、左右空格
Oct 21 Javascript
详解vue-admin和后端(flask)分离结合的例子
Feb 12 Javascript
微信小程序实现换肤功能
Mar 14 Javascript
vue-devtools的安装步骤
Apr 23 Javascript
ES6模板字符串和标签模板的应用实例分析
Jun 25 Javascript
vue 查看dist文件里的结构(多种方式)
Jan 17 Javascript
简单了解JS打开url的方法
Feb 21 Javascript
js实现简单进度条效果
Mar 25 Javascript
angular组件间通讯的实现方法示例
May 07 Javascript
在Vue中使用HOC模式的实现
Aug 23 Javascript
JavaScript面向对象核心知识与概念归纳整理
May 09 #Javascript
Vue列表如何实现滚动到指定位置样式改变效果
May 09 #Javascript
Node.js API详解之 util模块用法实例分析
May 09 #Javascript
Vue实现PC端靠边悬浮球的代码
May 09 #Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
May 08 #Javascript
基于JavaScript实现表格隔行换色
May 08 #Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
May 09 #Javascript
You might like
解析php时间戳与日期的转换
2013/06/06 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
layui prompt 设置允许空白提交的方法
2019/09/24 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
Python 正则表达式(转义问题)
2014/12/15 Python
Python用threading实现多线程详解
2017/02/03 Python
Sanic框架请求与响应实例分析
2018/07/16 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
python递归实现快速排序
2018/08/18 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
python实现多线程端口扫描
2019/08/31 Python
Python运行DLL文件的方法
2020/01/17 Python
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
高校自主招生自荐信
2013/12/09 职场文书
医药代表个人求职信范本
2013/12/19 职场文书
母亲80寿诞答谢词
2014/01/16 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
详解TypeScript的基础类型
2022/02/18 Javascript