深入理解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算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
Jul 21 Javascript
js中top的作用深入剖析
Mar 04 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
May 15 Javascript
对 jQuery 中 data 方法的误解分析
Jun 18 Javascript
JavaScript检查数字是否为整数或浮点数的方法
Jun 09 Javascript
一个仿微博登陆邮箱提示框js开发案例
Jul 28 Javascript
详解angular笔记路由之angular-router
Sep 12 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
Jan 02 Javascript
vue的全局提示框组件实例代码
Feb 26 Javascript
关于jquery layui弹出层的使用方法
Apr 21 jQuery
关于微信公众号开发无法支付的问题解决
Dec 28 Javascript
JavaScript 反射和属性赋值实例解析
Oct 28 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
基于pear auth实现登录验证
2010/02/26 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
浅谈php://filter的妙用
2019/03/05 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
Python 登录网站详解及实例
2017/04/11 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
详解Python if-elif-else知识点
2018/06/11 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
搭建python django虚拟环境完整步骤详解
2019/07/08 Python
Tensorflow 多线程设置方式
2020/02/06 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
投标邀请书范文
2014/01/31 职场文书
销售会计岗位职责
2014/03/15 职场文书
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL