浅析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 相关文章推荐
Jquery实现无刷新DropDownList联动实现代码
Mar 08 Javascript
JavaScript Accessor实现说明
Dec 06 Javascript
一个js过滤空格的小函数
Oct 10 Javascript
js实现透明度渐变效果的方法
Apr 10 Javascript
在JavaScript中调用Java类和接口的方法
Sep 07 Javascript
js实现适合新闻类图片的轮播效果
Feb 05 Javascript
ajax请求+vue.js渲染+页面加载的示例
Feb 11 Javascript
Vue父组件调用子组件事件方法
Feb 23 Javascript
基于element-ui组件手动实现单选和上传功能
Dec 06 Javascript
微信小程序实现的picker多级联动功能示例
May 23 Javascript
Node.js中console.log()输出彩色字体的方法示例
Dec 01 Javascript
微信小程序 scroll-view 实现锚点跳转功能
Dec 12 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
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
php图片裁剪函数
2018/10/31 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
解析jquery获取父窗口的元素
2013/06/26 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
JavaScript定义函数的三种实现方法
2017/09/23 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
js代码实现轮播图
2020/05/04 Javascript
vue中父子组件的参数传递和应用示例
2021/01/04 Vue.js
Python判断变量是否已经定义的方法
2014/08/18 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
Python字符串的一些操作方法总结
2019/06/10 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
python实现mean-shift聚类算法
2020/06/10 Python
Python 如何创建一个线程池
2020/07/28 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
武汉高蓝德国际.net机试
2016/06/24 面试题
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
2014年中班元旦活动方案
2014/02/14 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
安全横幅标语
2014/06/09 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS