在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 相关文章推荐
在新窗口打开超链接的方法小结
Apr 14 Javascript
jquery检测input checked 控件是否被选中的方法
Mar 26 Javascript
jquery中filter方法用法实例分析
Feb 06 Javascript
jquery validate.js表单验证入门实例(附源码)
Nov 10 Javascript
利用jquery获取select下拉框的值
Nov 23 Javascript
javascript实现延时显示提示框效果
Jun 01 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
Dec 25 Javascript
通过实例学习React中事件节流防抖
Jun 17 Javascript
vue.js实现备忘录demo
Jun 26 Javascript
vue按需加载实例详解
Sep 06 Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
Aug 07 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日历
2015/11/17 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
Yii框架批量插入数据扩展类的简单实现方法
2017/05/23 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
pow在python中的含义及用法
2019/07/11 Python
python视频按帧截取图片工具
2019/07/23 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
小学优秀班主任事迹材料
2014/05/17 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP
Java Socket实现多人聊天系统
2021/07/15 Java/Android