在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 Tools Dateinput使用介绍
Jul 14 Javascript
Firefox和IE兼容性问题及解决方法总结
Oct 08 Javascript
js将字符串转成正则表达式的实现方法
Nov 13 Javascript
javascript基础知识
Jun 07 Javascript
原生js实现ajax方法(超简单)
Sep 20 Javascript
Vue源码解析之Template转化为AST的实现方法
Dec 14 Javascript
微信小程序框架的页面布局代码
Aug 17 Javascript
jquery中attr、prop、data区别与用法分析
Sep 25 jQuery
js中apply和call的理解与使用方法
Nov 27 Javascript
JS实现点餐自动选择框(案例分析)
Dec 10 Javascript
原生javascript制作的拼图游戏实现方法详解
Feb 23 Javascript
Ajax实现异步加载数据
Nov 17 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实现最简单的MVC框架实例教程
2014/09/08 PHP
Yii分页用法实例详解
2014/12/04 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
基于Jquery的温度计动画效果
2010/06/18 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
webpack是如何实现模块化加载的方法
2019/11/06 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
Python基类函数的重载与调用实例分析
2015/01/12 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
办公室保洁员岗位职责
2013/12/02 职场文书
业绩考核岗位职责
2014/02/01 职场文书
理工类毕业自我鉴定
2014/02/20 职场文书
求职自荐信怎么写
2014/03/06 职场文书
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
公安机关正风肃纪剖析材料
2014/10/10 职场文书
房产公证书
2015/01/23 职场文书
电话营销开场白
2015/05/29 职场文书
防震减灾主题班会
2015/08/14 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
Python音乐爬虫完美绕过反爬
2021/08/30 Python
python编程实现清理微信重复缓存文件
2021/11/01 Python