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拓展DOM操作 prependChild insertAfert
Nov 17 Javascript
Jquery时间验证和转换工具小例子
Jul 01 Javascript
仿百度输入框智能提示的js代码
Aug 22 Javascript
Jquery attr("checked") 返回checked或undefined 获取选中失效
Oct 10 Javascript
常用的几段javascript代码分享
Mar 25 Javascript
浅谈jQuery的offset()方法及示例分享
Jul 17 Javascript
微信支付如何实现内置浏览器的H5页面支付
Sep 25 Javascript
JS批量替换内容中关键词为超链接
Feb 20 Javascript
vue构建动态表单的方法示例
Sep 22 Javascript
JavaScript如何获取一个元素的样式信息
Jul 29 Javascript
jQuery zTree插件使用简单教程
Aug 16 jQuery
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
Nov 09 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
openflashchart 2.0 简单案例php版
2012/05/21 PHP
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
vuex的使用步骤
2021/01/06 Vue.js
Python with的用法
2014/08/22 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
Python使用struct处理二进制的实例详解
2017/09/11 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python3安装speech语音模块的方法
2018/12/24 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
如何基于python测量代码运行时间
2019/12/25 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
python中return不返回值的问题解析
2020/07/22 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
新闻编辑自荐书范文
2014/02/12 职场文书
另类冲刺标语
2014/06/24 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
工商局个人工作总结
2015/03/03 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
python 爬取华为应用市场评论
2021/05/29 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏