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脚本实现Web页面信息交互
Oct 11 Javascript
ASP.NET中AJAX 调用实例代码
May 03 Javascript
JQuery中$.ajax()方法参数详解及应用
Dec 12 Javascript
JavaScript初学者建议:不要去管浏览器兼容
Feb 04 Javascript
jQuery文字提示与图片提示效果实现方法
Jul 04 Javascript
JavaScript面试题大全(推荐)
Sep 22 Javascript
详解webpack+es6+angular1.x项目构建
May 02 Javascript
详解react-router如何实现按需加载
Jun 15 Javascript
详解基于node的前端项目编译时内存溢出问题
Aug 01 Javascript
vue-router命名路由和编程式路由传参讲解
Jan 19 Javascript
vue中使用微信公众号js-sdk踩坑记录
Mar 29 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
Aug 06 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
第十二节 类的自动加载 [12]
2006/10/09 PHP
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
php session安全问题分析
2011/06/24 PHP
解析ajax事件的调用顺序
2013/06/17 PHP
php反射应用示例
2014/02/25 PHP
php数据访问之查询关键字
2016/05/09 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
原生的html元素选择器类似jquery选择器
2014/10/15 Javascript
JavaScript驾驭网页-CSS与DOM
2016/03/24 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
Vue组件系列开发之模态框
2019/04/18 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
在python中实现调用可执行文件.exe的3种方法
2019/07/07 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
历史学专业毕业生求职信
2013/09/27 职场文书
硕士研究生自我鉴定范文
2013/12/27 职场文书
高一地理教学反思
2014/01/18 职场文书
优秀志愿者事迹材料
2014/02/03 职场文书
大学生就业求职信
2014/06/12 职场文书
安全环保演讲稿
2014/08/28 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
旅游安全责任协议书
2016/03/22 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
一文搞懂php的垃圾回收机制
2021/06/18 PHP