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 Eval 函数使用
Mar 23 Javascript
jQuery实现的立体文字渐变效果
May 17 Javascript
JS获得URL超链接的参数值实例代码
Jun 21 Javascript
jQuery简易图片放大特效示例代码
Jun 09 Javascript
浅谈javascript面向对象程序设计
Jan 21 Javascript
js日期范围初始化得到前一个月日期的方法
May 05 Javascript
JavaScript实现多种排序算法
Feb 24 Javascript
JS查找字符串中出现次数最多的字符
Sep 05 Javascript
JS的Ajax与后端交互数据的实例
Aug 08 Javascript
C#程序员入门学习微信小程序的笔记
Mar 05 Javascript
vue服务端渲染操作简单入门实例分析
Aug 28 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
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+curl 发送图片处理代码分享
2015/07/09 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
javascript关于继承解析
2016/05/10 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
python实现各种插值法(数值分析)
2019/07/30 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
材料专业毕业生求职信
2014/02/26 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
矛盾论读书笔记
2015/06/29 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
Python自动化测试PO模型封装过程详解
2021/06/22 Python
Python学习之os包使用教程详解
2022/03/21 Python