在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 getElementsByClassName 和js取地址栏参数
Jan 02 Javascript
js中文逗号转英文实现
Feb 11 Javascript
js控制浏览器全屏示例代码
Feb 20 Javascript
js实现在同一窗口浏览图片
Sep 17 Javascript
jQuery焦点图轮播特效代码分享(3款)
Sep 05 Javascript
jquery mobile界面数据刷新的实现方法
May 28 Javascript
微信小程序  modal详解及实例代码
Nov 09 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
Mar 22 Javascript
AngularJS发送异步Get/Post请求方法
Aug 13 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
Sep 26 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
Oct 26 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
Aug 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
在html文件中也可以执行php语句的方法
2015/04/09 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
ext jquery 简单比较
2010/04/07 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
Jquery AJAX POST与GET之间的区别
2013/11/14 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python素数检测的方法
2015/05/11 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
Python API自动化框架总结
2019/11/12 Python
运行Python编写的程序方法实例
2020/10/21 Python
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
初婚未育未抱养证明
2014/01/12 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
圣诞晚会主持词
2015/07/01 职场文书
JS + HTML 罗盘式时钟的实现
2021/05/21 Javascript
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android
python 学习GCN图卷积神经网络
2022/05/11 Python
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS