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 相关文章推荐
Js切换功能的简单方法
Nov 23 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
Jun 24 Javascript
js 金额格式化来回转换示例
Feb 23 Javascript
jquery对table中各数据的增加、保存、删除操作示例
May 14 Javascript
JavaScript对象参数的引用传递
Jan 14 Javascript
jQuery ajax应用总结
Jun 02 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
Jun 14 Javascript
在JS中a标签加入单击事件屏蔽href跳转页面
Dec 16 Javascript
原生js实现弹出层效果
Jan 20 Javascript
element-ui 中使用upload多文件上传只请求一次接口
Jul 19 Javascript
javascript递归函数定义和用法示例分析
Jul 22 Javascript
jQuery ajax - getScript() 方法和getJSON方法
May 14 jQuery
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
DIY实用性框形天线
2021/03/02 无线电
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
php 分页类 扩展代码
2009/06/11 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
快速学习AngularJs HTTP响应拦截器
2015/12/31 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
JavaScript设计模式之代理模式简单实例教程
2018/07/03 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python字符串处理实现单词反转
2017/06/14 Python
python实现决策树
2017/12/21 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
python实现键盘输入的实操方法
2019/07/16 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
体育系毕业生求职自荐信
2014/04/16 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
2014年财政所工作总结
2014/11/22 职场文书
消防演习通知
2015/04/25 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
Django migrate报错的解决方案
2021/05/20 Python
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
go开发alertmanger实现钉钉报警
2021/07/16 Golang
pytorch中的 .view()函数的用法介绍
2022/03/17 Python