在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 相关文章推荐
关于document.cookie的使用javascript
Oct 29 Javascript
jQuery避免$符和其他JS库冲突的方法对比
Feb 20 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
Jul 14 Javascript
jquery实现在光标位置插入内容的方法
Feb 05 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
Feb 23 Javascript
JavaScript时间操作之年月日星期级联操作
Jan 15 Javascript
微信小程序开发经验总结(推荐)
Jan 11 Javascript
Jquery实现跨域异步上传文件总结
Feb 03 Javascript
jQuery上传插件webupload使用方法
Aug 01 jQuery
基于JSON数据格式详解
Aug 31 Javascript
vue2导航根据路由传值,而改变导航内容的实例
Nov 10 Javascript
Bootstrap实现下拉菜单多级联动
Nov 23 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
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
解析yii数据库的增删查改
2013/06/20 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
两个Javascript小tip资料
2010/11/23 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
python通过实例讲解反射机制
2019/10/17 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
Python调用Redis的示例代码
2020/11/24 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
EJB3推出JPA的原因
2013/10/16 面试题
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
心得体会的写法
2014/09/05 职场文书
物流业务员岗位职责
2015/04/03 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL
Javascript webpack动态import
2022/04/19 Javascript