在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 相关文章推荐
asp javascript 实现关闭窗口时保存数据的办法
Nov 24 Javascript
jQuery前台数据获取实现代码
Mar 16 Javascript
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
浅谈JavaScript正则表达式分组匹配
Apr 10 Javascript
Bootstrap每天必学之附加导航(Affix)插件
Apr 25 Javascript
Angularjs过滤器使用详解
May 25 Javascript
JavaScript继承与多继承实例分析
May 26 Javascript
React中嵌套组件与被嵌套组件的通信过程
Jul 11 Javascript
Puppeteer环境搭建的详细步骤
Sep 21 Javascript
VUE 配置vue-devtools调试工具及安装方法
Sep 30 Javascript
Ajax 的初步实现(使用vscode+node.js+express框架)
Jun 18 Javascript
JS封装cavans多种滤镜组件
Feb 15 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调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
QQ登录简单实现代码
2021/03/09 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
React diff算法的实现示例
2018/04/20 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
JS运算符优先级与表达式示例详解
2020/09/04 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
python复制与引用用法分析
2015/04/08 Python
Python计算三角函数之asin()方法的使用
2015/05/15 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
高中语文教学反思
2014/01/16 职场文书
遥感技术与仪器求职信
2014/02/22 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
三方协议书范本
2014/04/22 职场文书
nginx静态资源的服务器配置方法
2022/07/07 Servers