深入理解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代码
Dec 26 Javascript
js中继承的几种用法总结(apply,call,prototype)
Dec 26 Javascript
JavaScript在IE和FF下的兼容性问题
May 19 Javascript
原生js与jQuery实现简单的tab切换特效对比
Jul 30 Javascript
Vue.js展示AJAX数据简单示例讲解
Mar 29 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
Sep 04 Javascript
node文字生成图片的示例代码
Oct 26 Javascript
Vue 3.x+axios跨域方案的踩坑指南
Jul 04 Javascript
VUE.js实现动态设置输入框disabled属性
Oct 28 Javascript
浅谈vue 锚点指令v-anchor的使用
Nov 13 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 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构造方法中析构方法在继承中的表现
2016/04/12 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
PHP超全局变量实现原理及代码解析
2020/09/01 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
python 日期操作类代码
2018/05/05 Python
Python3匿名函数用法示例
2018/07/25 Python
Python爬取成语接龙类网站
2018/10/19 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
德国网上药房:Apotal
2017/04/04 全球购物
逻辑链路控制协议
2016/10/01 面试题
软件测试英文面试题
2012/10/14 面试题
大四学年自我鉴定
2013/11/13 职场文书
实习教师自我鉴定
2013/12/09 职场文书
自我评价的写作规则
2014/01/06 职场文书
《珍珠泉》教学反思
2014/02/20 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
验房委托书
2014/08/30 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
孔庙导游词
2015/02/04 职场文书