JavaScript变量提升和严格模式实例分析


Posted in Javascript onJanuary 27, 2019

本文实例讲述了JavaScript变量提升和严格模式。分享给大家供大家参考,具体如下:

1.什么是变量提升

所谓的变量提升指的是:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体(作用域)的最顶部。

下面我们通过一个例子来详细说明一下。

//变量声明在使用之前
var x;
console.log(x);//undefined
//变量声明在使用之后
console.log(y);//undefined
var y;
//上面的式子可以写成下面的样子
/*
变量提升:把x,y提升到顶部
var x;
var y;
console.log(x);
console.log(y);
*/

从上面这个例子我们可以看到:

①变量的使用有两种形式,先声明再使用或者先使用后声明;

②无论是哪一种形式都不影响变量的使用,这是因为有变量提升的存在,每一个你定义的变量都会被提升到顶部,也就是函数最开始的部分,这就变成了你在使用变量时其实都已经声明变量了。

下面我举一个经典的例子来更好地理解一下。

//经典案例:window表示全局,判断条件(变量a是否有在全局下)是在变量a声明之前
if(a in window){
  var a;
  console.log('a in window');
}else{console.log('a not in window');}
//a in window
//相当于:
/*
var a; //a被提升到顶部
if(a in window){
  console.log('a in window');
}else{console.log('a not in window');}
*/

这是变量提升的一个很好的例子,可以看到打印出来的结果表明,在我们使用a之前,声明变量a就被提升到顶部。

但是,要注意的是JavaScript 只有声明的变量会提升,初始化的不会。

console.log(c);//undefined
var c = 1; //初始化
/*
var c;
console.log(c);
c = 1;
*/
var d;//声明d
d = 1;//初始化
console.log(d);//1

上面的c打印结果为undefined,这是因为提升的只有声明变量var c,而初始化的c=1没有提升而在使用之后。

为了避免上面出现的变量提升的问题,通常我们在每个作用域开始前声明我们要使用的变量。

2.严格模式

严格模式的写法就是在代码编写之前加上"use strict",严格模式要求你不能使用未声明的变量,否则会报错。

例如:

"use strict"; //严格模式
m =1;
console.log(m);//m is not defined
//在严格模式下,因为m未被声明就被使用或者初始化则会报错
var n = 1;
console.log(n);//1

但是在没有使用严格模式的时候:

m =1;
console.log(m);//1
//在非严格模式下,同样这样写就不会报错

虽然还是没有声明变量m但还是可以使用的。

所以,还是建议大家尽可能得使用严格模式来编写javascript代码,以消除Javascript语法的一些不合理、不严谨之处,让自己成为一个更优秀的程序员。

感兴趣的朋友还可以使用本站在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行结果。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 实现父窗口引用弹出窗口的值的脚本
Aug 07 Javascript
JavaScript 在线压缩和格式化收藏
Jan 16 Javascript
javascript 常用代码技巧大收集
Feb 25 Javascript
js用typeof方法判断undefined类型
Jul 15 Javascript
node.js中的fs.statSync方法使用说明
Dec 16 Javascript
jquery采用oop模式class类的使用示例
Jan 22 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
Jul 12 Javascript
JSON 对象未定义错误的解决方法
Sep 29 Javascript
Vue开发中整合axios的文件整理
Apr 29 Javascript
JQuery扩展对象方法操作示例
Aug 21 jQuery
Vue 实现把表单form数据 转化成json格式的数据
Oct 29 Javascript
浅谈webpack和webpack-cli模块源码分析
Jan 19 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
Jan 27 #Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
Jan 27 #Javascript
原生JS检测CSS3动画是否结束的方法详解
Jan 27 #Javascript
原生JS实现的跳一跳小游戏完整实例
Jan 27 #Javascript
nuxt中使用路由守卫的方法步骤
Jan 27 #Javascript
vue-cli构建vue项目的步骤详解
Jan 27 #Javascript
vue实现的仿淘宝购物车功能详解
Jan 27 #Javascript
You might like
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
PHP设置进度条的方法
2015/07/08 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
javascript 命名规则 变量命名规则
2010/02/25 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
2014/06/12 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
JS实现的简单分页功能示例
2018/08/23 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
python list排序的两种方法及实例讲解
2017/03/20 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
Linux系统(CentOS)下python2.7.10安装
2018/09/26 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
Django urls.py重构及参数传递详解
2019/07/23 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
测绘工程系学生的自我评价
2013/11/30 职场文书
英文推荐信格式范文
2014/05/09 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
三严三实心得体会范文
2014/10/13 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
培训督导岗位职责
2015/04/10 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android