深入理解javascript变量声明


Posted in Javascript onNovember 20, 2014

相对于C/C++来说,ECMAScript里的for循环并不能创建一个局部的上下文。

for (var k in {a: 1, b: 2}) {

  alert(k);

}

alert(k); // 尽管循环已经结束但变量k依然在当前作用域
任何时候,变量只能通过使用var关键字才能声明。
 
上面的赋值语句:
 
a = 10;
这仅仅是给全局对象创建了一个新属性(但它不是变量)。“不是变量”并不是说它不能被改变,而是指它不符合ECMAScript规范中的变量概念,所以它“不是变量”(它之所以能成为全局对象的属性,完全是因为javascript中存在一个global对象,这样的操作不是声明一个变量而是给global对象增加一个a属性。
 
下面看一个简单的例题来说明问题

if (!("a" in window)) {

    var a = 1;

}

alert(a);

首先,所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1;
 
你可以用如下方式来检测全局变量是否声明
 
"变量名称" in window

第二,所有的变量声明都在范围作用域的顶部,看一下相似的例子:
 

alert("a" in window);

var a;

此时,尽管声明是在alert之后,alert弹出的依然是true,这是因为JavaScript引擎首先会扫墓所有的变量声明,然后将这些变量声明移动到顶部,最终的代码效果是这样的:

var a;

alert("a" in window);

第三,你需要理解该题目的意思是,变量声明被提前了,但变量赋值没有,因为这行代码包括了变量声明和变量赋值。

你可以将语句拆分为如下代码:

var a;    //声明

a = 1;    //初始化赋值

所以总结起来就是当变量声明和赋值在一起用的时候,JavaScript引擎会自动将它分为两部以便将变量声明提前,不将赋值的步骤提前是因为他有可能影响代码执行出不可预期的结果。

题目中的代码相当于:

var a;

if (!("a" in window)) {

    a = 1;

}

alert(a);

根据上述例题的分析,声明变量时如果是声明的局部变量前面一定要加var,如果声明的是全局变量可以不加var(最好限制全局变量的个数,尽量使用局部变量)

下面讲述一个使用var的几个特性

使用var语句多次声明一个变量不仅是合法的,而且也不会造成任何错误。
如果重复使用的一个声明有一个初始值,那么它担当的不过是一个赋值语句的角色。
如果重复使用的一个声明没有一个初始值,那么它不会对原来存在的变量有任何的影响。
没有var声明的变量,是作为全局变量存在的;有var声明的变量,属于局部变量,尤其是在函数内部。并且,经过测试,带var声明比不带var速度要快。函数内尽量多设局部变量,这样即安全又快速,变量操作也更加合理,不会因为函数内胡乱操作全局变量而导致逻辑错误。

声明对象时最好使用对象自面量的方式,这样的速度相对new的方式要快很多。

变量名是自己取的,为了照顾语义和规范,变量名可能稍长,但是注意了,变量名的长度也会影响代码的执行速度。长的变量名声明的执行速度没有短的快。

Javascript 相关文章推荐
javascript removeChild 使用注意事项
Apr 11 Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 Javascript
JavaScript自定义事件介绍
Aug 29 Javascript
浅析JavaScript中的delete运算符
Nov 30 Javascript
js实现全屏漂浮广告移入光标停止移动
Dec 02 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
May 11 Javascript
AngularJS基础教程之简单介绍
Sep 27 Javascript
Javascript的无new构建实例详解
May 15 Javascript
jQuery文字提示与图片提示效果实现方法
Jul 04 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
Jan 07 Javascript
你知道JavaScript Symbol类型怎么用吗
Jan 08 Javascript
vue-element-admin项目导入和导出的实现
May 21 Vue.js
javascript限制用户只能输汉字中文的方法
Nov 20 #Javascript
jQuery 中$(this).index与$.each的使用指南
Nov 20 #Javascript
jQuery提示效果代码分享
Nov 20 #Javascript
IE6浏览器中window.location.href无效的解决方法
Nov 20 #Javascript
js判断滚动条是否已到页面最底部或顶部实例
Nov 20 #Javascript
js中数组排序sort方法的原理分析
Nov 20 #Javascript
javascript继承机制实例详解
Nov 20 #Javascript
You might like
用php+javascript实现二级级联菜单的制作
2008/05/06 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
php Session存储到Redis的方法
2013/11/04 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
php操作access数据库的方法详解
2017/02/22 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
基于jQuery实现的单行公告活动轮播效果
2017/08/23 jQuery
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
vue中input的v-model清空操作
2019/09/06 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
基于python绘制科赫雪花
2018/06/22 Python
python实现画出e指数函数的图像
2019/11/21 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
自荐信格式写作方法有哪些呢
2013/11/20 职场文书
社区八一活动方案
2014/02/03 职场文书
2014全国两会学习心得体会1000字
2014/03/10 职场文书
大学生毕业评语
2014/12/31 职场文书
结婚保证书
2015/01/16 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
管辖权异议上诉状
2015/05/23 职场文书
主题班会开场白
2015/06/01 职场文书
教师节感想
2015/08/11 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python