在Javascript中 声明时用"var"与不用"var"的区别


Posted in Javascript onApril 15, 2013

Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的。可以正常运行的代码并不代表是合适的代码。

var num = 1;

是在当前域中声明变量. 如果在方法中声明,则为局部变量(local variable);如果是在全局域中声明,则为全局变量。

而 num = 1;

事实上是对属性赋值操作。首先,它会尝试在当前作用域链(如在方法中声明,则当前作用域链代表全局作用域和方法局部作用域etc。。。)中解析 num; 如果在任何当前作用域链中找到num,则会执行对num属性赋值; 如果没有找到num,它才会在全局对象(即当前作用域链的最顶层对象,如window对象)中创造num属性并赋值。

注意!它并不是声明了一个全局变量,而是创建了一个全局对象的属性。

即便如此,可能你还是很难明白“变量声明”跟“创建对象属性”在这里的区别。事实上,Javascript的变量声明、创建属性以及每个Javascript中的每个属性都有一定的标志说明它们的属性----如只读(ReadOnly)不可枚举(DontEnum)不可删除(DontDelete)等等。

由于变量声明自带不可删除属性,比较var num = 1 跟 num = 1,前者是变量声明,带不可删除属性,因此无法被删除;后者为全局变量的一个属性,因此可以从全局变量中删除。

具体见以下代码:

// num1为全局变量,num2为window的一个属性
                     var num1 = 1;
                     num2 = 2;
                     // delete num1;  无法删除
                     // delete num2;  删除
                     function model(){
                            var num1 = 1; // 本地变量
                            num2 = 2;     // window的属性
                            // 匿名函数
                            (function(){
                                   var num = 1; // 本地变量
                                   num1 = 2; // 继承作用域(闭包)
                                   num3 = 3; // window的属性
                            }())
                     }

PS. 在ECMAScript5标准中,有一种“严格模式”(Strict Mode)。在严格模式中,为未声明的标识符赋值将会抛引用错误,因此可以防止意外的全局变量属性的创造。目前一些浏览器的新版本已经支持。

Javascript 相关文章推荐
jQuery源码中的chunker 正则过滤符分析
Jul 31 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
Sep 26 Javascript
简单的Jquery遮罩层代码实例
Nov 14 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
Mar 03 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
Aug 15 Javascript
使用JQuery在线制作ppt并在线演示源码特效
Sep 08 Javascript
jQuery阻止移动端遮罩层后页面滚动
Mar 15 Javascript
react实现点击选中的li高亮的示例代码
May 24 Javascript
详解angular2如何手动点击特定元素上的点击事件
Oct 16 Javascript
用Cordova打包Vue项目的方法步骤
Feb 02 Javascript
微信小程序自定义底部弹出框动画
Nov 18 Javascript
Javascript中Microtask和Macrotask鲜为人知的知识点
Apr 02 Javascript
关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
Apr 15 #Javascript
深入了解javascript中的prototype与继承
Apr 14 #Javascript
谈谈JavaScript中的函数与闭包
Apr 14 #Javascript
在新窗口打开超链接的方法小结
Apr 14 #Javascript
JS中setTimeout()的用法详解
Apr 14 #Javascript
js验证是否为数字的总结
Apr 14 #Javascript
JS 实现Json查询的方法实例
Apr 12 #Javascript
You might like
php学习之数据类型之间的转换代码
2011/05/29 PHP
PHP笛卡尔积实现算法示例
2018/07/30 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
前端开发之便利店收银系统代码
2019/12/27 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
iview实现图片上传功能
2020/06/29 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
python字符串排序方法
2014/08/29 Python
python获取外网ip地址的方法总结
2015/07/02 Python
Python爬虫爬验证码实现功能详解
2016/04/14 Python
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
python2.7的编码问题与解决方法
2016/10/04 Python
Python2包含中文报错的解决方法
2018/07/09 Python
python实现决策树分类(2)
2018/08/30 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
校园之声广播稿
2014/01/31 职场文书
初中生自我评价
2014/02/01 职场文书
个人租房协议书(范本)
2014/10/14 职场文书
2014年督导工作总结
2014/11/19 职场文书
详解Python requests模块
2021/06/21 Python
python实现简单的三子棋游戏
2022/04/28 Python
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript