在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实现回车键(Enter)切换文本框焦点的代码实例
May 05 Javascript
jQuery实现表单步骤流程导航代码分享
Aug 28 Javascript
javascript瀑布流式图片懒加载实例
Jun 28 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
Sep 05 Javascript
jQuery select自动选中功能实现方法分析
Nov 28 Javascript
Angular.js实现动态加载组件详解
May 28 Javascript
AngularJs ng-change事件/指令的用法小结
Nov 01 Javascript
node 命令方式启动修改端口的方法
May 12 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
Apr 16 Javascript
细说webpack6 Babel的使用详解
Sep 26 Javascript
js实现鼠标拖拽div左右滑动
Jan 15 Javascript
vue 判断页面是首次进入还是再次刷新的实例
Nov 05 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 $_FILES中error返回值详解
2014/01/30 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
php计算整个目录大小的方法
2015/06/19 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
JavaScript 的方法重载效果
2009/08/07 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python中的自定义函数学习笔记
2014/09/23 Python
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
python实现俄罗斯方块
2018/06/26 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
解决Django中多条件查询的问题
2019/07/18 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
python里反向传播算法详解
2020/11/22 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
2014年小学安全工作总结
2014/12/04 职场文书
python利用pandas分析学生期末成绩实例代码
2021/07/09 Python