在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 相关文章推荐
监控 url fragment变化的js代码
Apr 19 Javascript
javascript中注册和移除事件的4种方式
Mar 20 Javascript
JS获取农历日期具体实例
Nov 14 Javascript
javascript带回调函数的异步脚本载入方法实例分析
Jul 02 Javascript
jqueryMobile使用示例分享
Jan 12 Javascript
AngularJS ng-controller 指令简单实例
Aug 01 Javascript
bootstrap使用validate实现简单校验功能
Dec 02 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
Jan 03 Javascript
微信小程序使用navigateTo数据传递的实例
Sep 26 Javascript
jQuery实现购物车的总价计算和总价传值功能
Nov 28 jQuery
详解React 服务端渲染方案完美的解决方案
Dec 14 Javascript
vue-router之实现导航切换过渡动画效果
Oct 31 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
1.PHP简介
2006/10/09 PHP
附件名前加网站名
2008/03/23 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
PHP验证码函数代码(简单实用)
2013/09/29 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
使用Scrapy爬取动态数据
2018/10/21 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
某公司Java工程师面试题笔试题
2016/03/27 面试题
文史专业毕业生自荐信
2013/11/17 职场文书
安全生产责任书
2014/03/12 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
课改心得体会范文
2016/01/25 职场文书
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers
MySQL数据库表约束讲解
2022/06/21 MySQL