在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 获取元素位置的快速方法 getBoundingClientRect()
Nov 26 Javascript
了解一点js的Eval函数
Jul 26 Javascript
JavaScript实现快速排序(自已编写)
Dec 19 Javascript
js网页版计算器的简单实现
Jul 02 Javascript
Jquery跳到页面指定位置的方法
May 12 Javascript
javascript 常见功能汇总
Jun 11 Javascript
AngularJS入门教程之AngularJS表达式
Apr 18 Javascript
JS实现左右无缝轮播图代码
May 01 Javascript
Vue2.0表单校验组件vee-validate的使用详解
May 02 Javascript
webstrom Debug 调试vue项目的方法步骤
Jul 17 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
Jun 04 Javascript
vite2.0+vue3移动端项目实战详解
Mar 03 Vue.js
关于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中鲜为人知的10个函数
2014/02/28 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
PHP二维数组去重算法
2016/12/17 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
详解webpack介绍&安装&常用命令
2017/06/29 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
Python 错误和异常小结
2013/10/09 Python
python解析html开发库pyquery使用方法
2014/02/07 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
python绘制漏斗图步骤详解
2019/03/04 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
2013年保送生自荐信格式
2013/11/20 职场文书
2014全国两会心得体会
2014/03/17 职场文书
党代会心得体会
2014/09/04 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
推普标语口号大全
2015/12/26 职场文书
SQL之各种join小结详细讲解
2021/08/04 MySQL
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python