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 循环读取JSON数据的代码
Jul 17 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
Sep 03 Javascript
实例讲解JS中数组Array的操作方法
May 09 Javascript
js采用concat和sort将N个数组拼接起来的方法
Jan 21 Javascript
JavaScript动态生成二维码图片
Apr 20 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
May 20 Javascript
浅析JavaScript中命名空间namespace模式
Jun 22 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
Nov 01 Javascript
浅谈AngularJS中ng-class的使用方法
Nov 11 Javascript
总结几道关于Node.js的面试问题
Jan 11 Javascript
node爬取新型冠状病毒的疫情实时动态
Feb 06 Javascript
Vue axios获取token临时令牌封装案例
Sep 11 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统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
js 对象使用的小技巧实例分析
2019/11/08 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
深入了解Python数据类型之列表
2016/06/24 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
Python正则表达式和元字符详解
2018/11/29 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
python @classmethod 的使用场合详解
2019/08/23 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
当当网软件测试笔试题
2015/11/24 面试题
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
专题民主生活会对照检查材料思想汇报
2014/09/29 职场文书