深入理解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 无符号右移赋值操作
Apr 17 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
Nov 17 Javascript
JavaScript简单实现鼠标拖动选择功能
Mar 06 Javascript
node.js中的fs.lchmodSync方法使用说明
Dec 16 Javascript
jQuery中ready事件用法实例
Jan 19 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
Jan 26 Javascript
js改变透明度实现轮播图的算法
Aug 24 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
Feb 20 Javascript
原生js实现吸顶效果
Mar 13 Javascript
原生JS实现的双色球功能示例
Feb 02 Javascript
讲解vue-router之什么是动态路由
May 28 Javascript
微信小程序开发技巧汇总
Jul 15 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
深入了解php4(1)--回到未来
2006/10/09 PHP
PHP中strtr字符串替换用法详解
2014/11/26 PHP
php获取图片信息的方法详解
2015/12/10 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
Python开发的实用计算器完整实例
2017/05/10 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
python实现媒体播放器功能
2018/02/11 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
PyTorch的自适应池化Adaptive Pooling实例
2020/01/03 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
《花的勇气》教后反思
2014/02/12 职场文书
美容院营销方案
2014/03/05 职场文书
我的长生果教学反思
2014/04/28 职场文书
人才市场接收函
2015/01/30 职场文书
公司员工手册范本
2015/05/14 职场文书
党员公开承诺书2016
2016/03/24 职场文书
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle