深入理解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 节点排序 2
Jan 31 Javascript
JavaScript获取某年某月的最后一天附截图
Jun 23 Javascript
详谈javascript异步编程
Feb 21 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
Mar 02 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
Aug 01 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
Mar 23 Javascript
基于js中的存储键值对以及注意事项介绍
Mar 30 Javascript
angular6开发steps步骤条组件
Jul 04 Javascript
vue更改数组中的值实例代码详解
Feb 07 Javascript
vue项目配置使用flow类型检查的步骤
Mar 18 Javascript
详解Vue3使用axios的配置教程
Apr 29 Vue.js
JS中forEach()、map()、every()、some()和filter()的用法
May 11 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&MYSQL服务器配置说明
2006/10/09 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
2013/06/14 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
JQuery 操作select标签实现代码
2010/05/14 Javascript
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
Python给图像添加噪声具体操作
2019/03/03 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
Python基于execjs运行js过程解析
2020/11/27 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
家庭户外服装:Hawkshead
2017/11/02 全球购物
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
建筑毕业生自我鉴定
2013/10/18 职场文书
国贸专业自荐信范文
2014/03/02 职场文书
2014春晚主持词
2014/03/25 职场文书
清明节网上祭英烈活动总结
2014/04/30 职场文书
单位消防安全责任书
2014/07/23 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
2014年学生工作总结
2014/11/20 职场文书
2014年图书室工作总结
2014/12/09 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏
小程序实现侧滑删除功能
2022/06/25 Javascript