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的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 Javascript
图片轮换效果实现代码(点击按钮停止执行)
Apr 12 Javascript
JavaScript正则表达式之multiline属性的应用
Jun 16 Javascript
浅析Node.js 中 Stream API 的使用
Oct 23 Javascript
前端设计师们最常用的JS代码汇总
Sep 25 Javascript
js浏览器html5表单验证
Oct 17 Javascript
jQuery选择器实例应用
Jan 05 Javascript
Vue开发过程中遇到的疑惑知识点总结
Jan 20 Javascript
单线程JavaScript实现异步过程详解
May 19 Javascript
如何在面试中手写出javascript节流和防抖函数
Oct 22 Javascript
微信小程序弹窗禁止页面滚动的实现代码
Dec 30 Javascript
JavaScript事件的委托(代理)的用法示例详解
Feb 18 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 header函数使用教程
2013/09/05 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
Javascript倒计时代码
2010/08/12 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
js实现仿网易点击弹出提示同时背景变暗效果
2015/08/13 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
Vue.js第四天学习笔记(组件)
2016/12/02 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
Python将字典转换为XML的方法
2020/08/01 Python
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
运动会通讯稿150字
2014/02/15 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
责任书格式
2019/04/18 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle
mysql 获取相邻数据项
2022/05/11 MySQL