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 相关文章推荐
从jQuery.camelCase()学习string.replace() 函数学习
Sep 13 Javascript
js作用域及作用域链概念理解及使用
Apr 15 Javascript
JavaScript获取和设置CheckBox状态的简单方法
Jul 05 Javascript
js实现ifram取父窗口URL地址的方法
Feb 09 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
Feb 25 Javascript
全面解析bootstrap格子布局
May 22 Javascript
jQuery简单获取DIV和A标签元素位置的方法
Feb 07 Javascript
Node.JS文件系统解析实例详解
May 15 Javascript
react学习笔记之state以及setState的使用
Dec 07 Javascript
Vue在页面数据渲染完成之后的调用方法
Sep 11 Javascript
详解为什么Vue中不要用index作为key(diff算法)
Apr 04 Javascript
JavaScript实现显示和隐藏图片
Apr 29 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
memcache命令启动参数中文解释
2014/01/13 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
js的onload事件及初始化按钮事件示例代码
2013/09/25 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
深入浅析Python的类
2018/06/22 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
让你Python到很爽的加速递归函数的装饰器
2019/05/26 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
干部培训自我鉴定
2014/01/22 职场文书
护理专科自荐书范文
2014/02/18 职场文书
敬老院活动总结
2014/04/28 职场文书
演讲稿的写法
2014/05/19 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python
css样式important规则的正确使用方式
2022/06/10 HTML / CSS