浅析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 相关文章推荐
破除一些网站复制、右键限制
Nov 04 Javascript
prototype Element学习笔记(篇一)
Oct 26 Javascript
Javascript中克隆一个数组的实现代码
Dec 06 Javascript
js验证输入是否为手机号码或电话号码示例
Dec 30 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
Apr 26 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
Jul 17 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
Aug 14 Javascript
bootstrap switch开关组件使用方法详解
Aug 22 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
Sep 01 Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
Mar 02 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
Jun 11 Javascript
JavaScript实现弹出窗口效果
Dec 09 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
php下获取http状态的实现代码
2014/05/09 PHP
简单实现PHP留言板功能
2016/12/21 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
详解Vue方法与事件
2017/03/09 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
Python中的tuple元组详细介绍
2015/02/02 Python
python基础知识小结之集合
2015/11/25 Python
python非递归全排列实现方法
2017/04/10 Python
Python正则表达式知识汇总
2017/09/22 Python
Python中创建二维数组
2018/10/17 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
python 实现list或string按指定分段
2019/12/25 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
python logging通过json文件配置的步骤
2020/04/27 Python
Python解析微信dat文件的方法
2020/11/30 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
成绩单公证书
2014/04/10 职场文书
促销活动总结怎么写
2014/06/25 职场文书
升职自荐信范文
2015/03/27 职场文书
联村联户简报
2015/07/21 职场文书
导游词之青岛太清宫
2019/12/13 职场文书