在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 相关文章推荐
JS实现定时页面弹出类似QQ新闻的提示框
Nov 07 Javascript
javascript的创建多行字符串的7种方法
Apr 29 Javascript
学习使用jquery iScroll.js移动端滚动条插件
Mar 24 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
Sep 01 Javascript
浅谈Angular的$q, defer, promise
Dec 20 Javascript
深入理解javascript中的 “this”
Jan 17 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 Javascript
vue 地区选择器v-distpicker的常用功能
Jul 23 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
Mar 29 Javascript
Vue前端判断数据对象是否为空的实例
Sep 02 Javascript
element多个表单校验的实现
May 27 Javascript
JavaScript高级程序设计之变量与作用域
Nov 17 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使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
如何打开php的gd2库
2017/02/09 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
Vue Router的懒加载路径的解决方法
2018/06/21 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
python实现动态数组的示例代码
2019/07/15 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
国际商务专业学生个人的自我评价
2013/09/28 职场文书
四川成都导游欢迎词
2014/01/18 职场文书
文员求职信
2014/07/15 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
Python如何加载模型并查看网络
2022/07/15 Python