JavaScript的变量声明与声明提前用法实例分析


Posted in Javascript onNovember 26, 2019

本文实例讲述了JavaScript的变量声明与声明提前用法。分享给大家供大家参考,具体如下:

JavaScript的变量声明

JavaScript的变量声明语句无论出现在何处,都会先于其他代码首先被执行。使用var关键词声明变量的作用域是当前的执行上下文,有可能是外围函数,或者,当变量声明在函数体之外时,则为全局变量。

向一个未声明变量赋值会隐式地将其创建为一个全局变量(它变成了全局对象的一个属性)。声明变量与未声明变量之间的区别为:

1. 声明变量的作用范围限定在其执行的上下文环境中。未声明的变量总是全局的。

function x() {
 y = 1;  // Throws a ReferenceError in strict mode
 var z = 2;
}
x();
console.log(y); // logs "1" 
console.log(z); // Throws a ReferenceError: z is not defined outside x

2. 声明变量在其他代码执行之前创建。未声明的变量在其赋值语句执行之前都是不存在的。

console.log(a);        // Throws a ReferenceError.
console.log('still going...'); // Never executes.
var a;
console.log(a);        // logs "undefined" or "" depending on browser.
console.log('still going...'); // logs "still going...".

3. 声明变量是执行上下文(函数或者全局)的不可配置的属性。而未声明变量是可配置的(例如,可以被delete)

var a = 1;
b = 2;
delete this.a; // Throws a TypeError in strict mode. Fails silently otherwise.
delete this.b;
console.log(a, b); // Throws a ReferenceError. 
// The 'b' property was deleted and no longer exists.

由于以上三点不同,使用未声明变量可能会带来意想不到的结果。因此建议无论是全局变量还是局部变量,在使用前都要声明。在ECMAScript5的严格模式下,对未声明变量赋值会抛出一个错误。

声明提前(var hoisting):

JavaScript的函数作用域是指在函数内声明的所有变量在函数体内是始终可见的。有趣的是,这意味着变量甚至可以先使用,后声明。

JavaScript的这一特性被非正式地称为声明提前(hoiosting),即JavaScript函数中所有变量的声明都被“提前”至函数体的顶部。

(“声明提前”的操作是在JavaScript引擎的“预编译”时进行的,即在代码运行之前)

例如下面的JavaScript代码:

var scope = "global";
function f() {
  alert(scope);
  var scope = "local"; //覆盖全局变量
  alert(scope);
}

读者可能误以为函数f的第一个alert会输出"global",因为代码此时还没有执行到var语句声明局部变量的代码行。

其实不然,由于函数作用域的特性,局部变量在整个函数体内始终是有定义的,亦即,在函数体内局部变量覆盖了同名的全局变量。尽管如此,只有程序执行到var语句时,局部变量才会被赋值。因此上述过程等价于,将函数体内的变量声明“提前”至函数体顶部,而变量的初始化保留在原处。

function f() {
  var scope; //函数体顶部声明局部变量
  alert(scope); //输出"undefined"
  scope = "local"; //变量初始化赋值
  alert(scope); //输出"local"
}

基于此原因,建议将变量的声明都放在作用域的顶部(全局代码的顶端,或者函数代码的开始),从而清楚地区分变量的作用域,哪些是函数作用域,哪些在作用域链上解析。

参考资料:

1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

2. 《JavaScript权威指南》 第6版 中文版

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

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

Javascript 相关文章推荐
JavaScript 字符编码规则
May 04 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
Jan 28 Javascript
浅析javascript中函数声明和函数表达式的区别
Feb 15 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
Jun 18 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
Oct 29 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
Dec 10 Javascript
详解weex默认webpack.config.js改造
Jan 08 Javascript
关于redux-saga中take使用方法详解
Feb 27 Javascript
vue移动端UI框架实现QQ侧边菜单组件
Mar 09 Javascript
vue.extend实现alert模态框弹窗组件
Apr 28 Javascript
深入理解Angularjs 脏值检测
Oct 12 Javascript
可拖拽组件slider.js使用方法详解
Dec 04 Javascript
vue中keep-alive,include的缓存问题
Nov 26 #Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
Nov 26 #Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
Nov 26 #jQuery
原生js实现贪食蛇小游戏的思路详解
Nov 26 #Javascript
高效jQuery选择器的5个技巧实例分析
Nov 26 #jQuery
JavaScript计算正方形面积
Nov 26 #Javascript
javaScript中indexOf用法技巧
Nov 26 #Javascript
You might like
php 生成短网址原理及代码
2014/01/23 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
DWZ刷新dialog解决方法
2013/03/03 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
简单的js表单验证函数
2013/10/28 Javascript
js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
2014/01/27 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
python3新特性函数注释Function Annotations用法分析
2016/07/28 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
python实现图片识别汽车功能
2018/11/30 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
python 图像增强算法实现详解
2021/01/24 Python
HTML5中外部浏览器唤起微信分享功能的代码
2020/09/15 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
竞选村长演讲稿
2014/04/28 职场文书
中专毕业生的自荐书
2014/07/01 职场文书
美术专业自荐信
2014/07/07 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
白鹤梁导游词
2015/02/06 职场文书
导游词之山东八大关
2019/12/18 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫