在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 相关文章推荐
Javascript 中介者模式实例
Dec 16 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
Jan 27 Javascript
基于jQuery中对数组进行操作的方法
Apr 16 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
Mar 04 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
Apr 07 Javascript
js删除Array数组中指定元素的两种方法
Aug 03 Javascript
Javascript中八种遍历方法的执行速度深度对比
Apr 25 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
Jul 20 Javascript
Vue循环组件加validate多表单验证的实例
Sep 18 Javascript
JavaScript作用域链实例详解
Jan 21 Javascript
vue弹出框组件封装实例代码
Oct 31 Javascript
使用Bootstrap做一个朝代历史表
Dec 10 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标签云的实现代码
2012/10/10 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
PHP 断点续传实例详解
2017/11/11 PHP
JavaScript入门之基本函数详解
2011/10/21 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
flask session组件的使用示例
2018/12/25 Python
python 字典套字典或列表的示例
2019/12/16 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
会计专业应届生求职信
2013/11/24 职场文书
工商企业管理实习自我鉴定
2013/12/04 职场文书
老人祝寿主持词
2014/03/28 职场文书
马智宇结婚主持词
2014/04/01 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
2015年度质量工作总结报告
2015/04/27 职场文书
东京审判观后感
2015/06/01 职场文书
2015年国培研修感言
2015/08/01 职场文书
《秋思》教学反思
2016/02/23 职场文书
Golang 实现超大文件读取的两种方法
2021/04/27 Golang
mysqldump进行数据备份详解
2022/07/15 MySQL