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 迁移目录
Dec 18 Javascript
Javascript的构造函数和constructor属性
Jan 09 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
Jul 09 Javascript
javascript校验价格合法性实例(必须输入2位小数)
May 05 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
Nov 26 Javascript
Bootstrap按钮下拉菜单组件详解
May 10 Javascript
Vue.js每天必学之Class与样式绑定
Sep 05 Javascript
AngularJS中的Promise详细介绍及实例代码
Dec 13 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
Jul 09 Javascript
浅谈Angular 观察者模式理解
Nov 01 Javascript
微信小程序代码上传、审核发布小程序
May 18 Javascript
Vue 动态添加路由及生成菜单的方法示例
Jun 20 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
apache php模块整合操作指南
2012/11/16 PHP
php中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
opencv 识别微信登录验证滑动块位置
2018/08/07 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
初步理解Python进程的信号通讯
2015/04/09 Python
在Python中使用列表生成式的教程
2015/04/27 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
python 基于opencv操作摄像头
2020/12/24 Python
商务英语专业应届毕业生求职信
2013/10/28 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
教书育人演讲稿
2014/09/11 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python