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代码(站点及虚拟目录)
Oct 20 Javascript
js代码实现无缝滚动(文字和图片)
Aug 20 Javascript
JavaScript中的Function函数
Aug 27 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
详解VUE的状态控制与延时加载刷新
Mar 27 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
May 12 Javascript
原生JS实现日历组件的示例代码
Sep 22 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
Sep 07 Javascript
在vue项目中集成graphql(vue-ApolloClient)
Sep 08 Javascript
JS实现canvas简单小画板功能
Jun 23 Javascript
JQuery Ajax如何实现注册检测用户名
Sep 25 jQuery
吃通javascript正则表达式
Apr 21 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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
详解YII关联查询
2016/01/10 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
bootstrap是什么_动力节点Java学院整理
2017/07/14 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
哪些是python中web开发框架
2020/06/17 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
简短的公司员工自我评价分享
2013/11/13 职场文书
社区庆八一活动方案
2014/02/02 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
上课说话检讨书
2015/01/27 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
2016庆祝国庆67周年宣传语
2015/11/25 职场文书
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏