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 相关文章推荐
JScript内置对象Array中元素的删除方法
Mar 08 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
Oct 11 Javascript
js setTimeout 常见问题小结
Aug 13 Javascript
js实现全屏漂浮广告移入光标停止移动
Dec 02 Javascript
js出生日期 年月日级联菜单示例代码
Jan 10 Javascript
node.js中express中间件body-parser的介绍与用法详解
May 23 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
Oct 26 Javascript
js阻止默认右键的下拉菜单方法
Jan 02 Javascript
vue.js图片转Base64上传图片并预览的实现方法
Aug 02 Javascript
layui的数据表格+springmvc实现搜索功能的例子
Sep 28 Javascript
vue等两个接口都返回结果再执行下一步的实例
Sep 08 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 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 Cookie的一个使用注意点
2008/11/08 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
angular中如何绑定iframe中src的方法
2019/02/01 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
python读取word文档的方法
2015/05/09 Python
Python File(文件) 方法整理
2019/02/18 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
行政管理专业推荐信
2013/11/02 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
2015感人爱情寄语
2015/02/26 职场文书
聊聊配置 Nginx 访问与错误日志的问题
2022/05/25 Servers