深入理解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 相关文章推荐
CSS JavaScript 实现菜单功能 改进版
Dec 09 Javascript
有趣的javascript数组定义方法
Sep 10 Javascript
登陆成功后自动计算秒数执行跳转
Jan 23 Javascript
用js判断输入是否为中文的函数
Mar 10 Javascript
超赞的动手创建JavaScript框架的详细教程
Jun 30 Javascript
完美解决IE9浏览器出现的对象未定义问题
Sep 29 Javascript
jQuery Ajax实现跨域请求
Jan 21 Javascript
jQuery层级选择器实例代码
Feb 06 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
Apr 28 Javascript
使用express+multer实现node中的图片上传功能
Feb 02 Javascript
详解webpack 热更新优化
Sep 13 Javascript
原生js实现照片墙效果
Oct 13 Javascript
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执行速度全攻略
2006/10/09 PHP
我的论坛源代码(六)
2006/10/09 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
js函数排序的实例代码
2013/07/01 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
vue实现在线翻译功能
2019/09/27 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
python开发一款翻译工具
2020/10/10 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
美国最大点评网站:Yelp
2018/02/14 全球购物
《狮子和兔子》教学反思
2014/03/02 职场文书
导师推荐信范文
2014/05/09 职场文书
《风筝》教学反思
2016/02/23 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang
Java中的继承、多态以及封装
2022/04/11 Java/Android
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL