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中的面向对象
Nov 18 Javascript
JS实现黑客帝国文字下落效果
Sep 01 Javascript
基于jquery实现简单的手风琴特效
Nov 24 Javascript
sencha ext js 6 快速入门(必看)
Jun 01 Javascript
jQuery中的AjaxSubmit使用讲解
Sep 25 Javascript
简单实现js倒计时功能
Feb 13 Javascript
微信二次分享报错invalid signature问题及解决方法
Apr 01 Javascript
JS数组splice操作实例分析
Oct 12 Javascript
JavaScript定时器常见用法实例分析
Nov 15 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
Aug 06 Javascript
在elementui中Notification组件添加点击事件实例
Nov 11 Javascript
如何用JS实现简单的数据监听
May 06 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
模仿OSO的论坛(三)
2006/10/09 PHP
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
把input初始值不写value的具体实现方法
2013/07/04 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
基于javascript实现图片预加载
2016/01/05 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
python编辑用户登入界面的实现代码
2018/07/16 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
手机业务员岗位职责
2013/12/13 职场文书
本科生的职业生涯规划范文
2014/01/09 职场文书
教师节商场活动方案
2014/02/13 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
优秀团员自我评价
2015/03/10 职场文书
管理失职检讨书
2015/05/05 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
观看建国大业观后感
2015/06/01 职场文书
科技馆观后感
2015/06/08 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers