浅析JavaScript声明变量


Posted in Javascript onDecember 21, 2015

JavaScript的变量声明语句无论出现在何处,都会先于其他代码首先被执行。使用var关键词声明变量的作用域是当前的执行上下文,有可能是外围函数,或者,当变量声明在函数体之外时,则为全局变量。

定义在函数体外的都属于全局变量,定义在函数体内的属于局部变量。这里的定义是指通过var声明的。

JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性。例如:

function test(){
myname = "huming";
alert(myname);
}
test();// "huming"
alert(myname);
//"huming"

两个结果是一样的,说明myname是一个全局变量。

那么,隐式全局变量和明确定义的全局变量有没有区别呢。。答案肯定是有的,看下面的例子:

// 定义三个全局变量
var global_test = ;
global_test = ; // 反面教材
(function () {
global_test = ; // 反面教材
}());
// 试图删除
delete global_test; // false
delete global_test; // true
delete global_test; // true
// 测试该删除
alert(typeof global_test); // "number"
alert(typeof global_test); // "undefined"
alert(typeof global_test); // "undefined"

由上面的例子可以看出:在函数之外通过var定义的global_test1不能被删除,而没有经过var定义的global_test2和global_test3都被删除了(无论是否是在函数体内创建)。

总结来说,在函数体外通过var声明的全局变量不能被删除,而隐式全局变量是可以删除的。

这里要注意了:JavaScript有一种行为叫做“hoisting”(悬置/置顶解析/预解析)。

我们通过一个例子来说明:

var myname = "huming"; //声明全局变量
function test() {
alert(myname);
var myname = "local_huming";
alert(myname);
}
test();

你猜两次alert的内容一致吗??显然不一致,一致还用说吗。。实际输出是:"undefined", "local_huming"。

上面的例子等同于

var myname = "huming"; //声明全局变量
function test() {
var myname;

alert(maname);<br>
myname = "local_huming";

alert(myname); // "local"
}
test();

第一次alert输出的myname并不是你以为的全局变量,而是和它在一个作用域(一个函数体)内的局部变量。虽然它还没有被声明,但被当作是声明了。这就是所谓的“hoisting”。

这样应该就明白了吧。当你在函数体中使用了一个变量,又在之后重新声明的话,就可能产生错误。

书写规范:

function test() {
var a = ,
b = ,
c = a + b,
d = {},
e,
f;
// function body...
}

好处在于:

1、所有局部变量都定义在函数开始,方便查找;

2、防止变量在定义之前使用的逻辑错误。

在javascript中,一个变量名(name)有四种方式进入作用域(scope)中

语言内置,所有的作用域中都有this和arguments关键字

形式参数,函数的参数在整个作用域中都是有效的

函数声明

变量声明

上面列出的四种顺序也正是由高到底的优先级的顺序,一旦一个变量名已经声明了,那么它就不可能被其他更低优先级的变量声明形式所覆盖。

Javascript 相关文章推荐
JavaScript几种形式的树结构菜单
May 10 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
Sep 26 Javascript
javascript加号&quot;+&quot;的二义性说明
Mar 04 Javascript
如何让页面加载完成后执行js
Jun 26 Javascript
绑定回车enter事件代码
May 18 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
Jul 15 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
Nov 18 Javascript
jQuery中选择器的基础使用教程
May 23 Javascript
JavaScript生成简单等差数列
Nov 28 Javascript
vue实现重置表单信息为空的方法
Sep 29 Javascript
layui--select使用以及下拉框实现键盘选择的例子
Sep 24 Javascript
JS实现移动端双指缩放和旋转方法
Dec 13 Javascript
jQuery实现图片文字淡入淡出效果
Dec 21 #Javascript
深入浅析Node.js 事件循环
Dec 20 #Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
Dec 20 #Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
Dec 20 #Javascript
jQuery mobile 移动web(4)
Dec 20 #Javascript
基于jQuery实现放大镜特效
Oct 19 #Javascript
jQuery mobile 移动web(6)
Dec 20 #Javascript
You might like
php join函数应用
2011/05/04 PHP
ThinkPHP之getField详解
2014/06/20 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
js下拉菜单语言选项简单实现
2013/09/23 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
在Pandas中处理NaN值的方法
2019/06/25 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
Python使用循环神经网络解决文本分类问题的方法详解
2020/01/16 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
python统计文章中单词出现次数实例
2020/02/27 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
存储过程和sql语句的优缺点
2014/07/02 面试题
大专生自荐书范文
2014/06/22 职场文书
房产分割协议书范文
2014/11/21 职场文书
放假通知怎么写
2015/08/18 职场文书
教师反邪教心得体会
2016/01/15 职场文书
施工安全责任协议书
2016/03/23 职场文书