JavaScript中变量声明有var和没var的区别示例介绍


Posted in Javascript onSeptember 15, 2014

本文来论述JavaScript中变量声明有var和没var的区别,关于Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是

(function(){ 
// ... 
})();

在函数内部,有var和没var声明的变量是不一样的。有var声明的是局部变量,没var的,声明的全局变量,所以可以借此向外暴露接口东东。
在全局作用域内声明变量时,有var 和没var看起来都一样,我们知道,声明的全局变量,就是window的属性,究竟是否一样,我们通过ECMAScrpit5提供的属性的特性查询方法,来发现之间的区别。

var fff = 2; 
window.ffa = 3; 
ffb = 4; 
this.ffc = 4; 
var ffftx = Object.getOwnPropertyDescriptor(window, 'fff'); //configurable:false,enumerable:true,value:2,writable:true 
var ffatx = Object.getOwnPropertyDescriptor(window, 'ffa'); //configurable:true,enumerable:true,value:2,writable:true 
var ffbtx = Object.getOwnPropertyDescriptor(window, 'ffb'); //configurable:true,enumerable:true,value:2,writable:true 
var ffctx = Object.getOwnPropertyDescriptor(window, 'ffc'); //configurable:true,enumerable:true,value:2,writable:true

通过上面,发现,原来还是有差别的,我们再用delete删除属性来验证下,配置性为false的属性无法删除。也就是通过变量var声明全局对象的属性无法删除,我们还会发现和函数声明创建的全局对象属性也无法删除。

delete fff; // 无法删除 
delete ffa; // 可删除 
delete ffb; // 可删除 
delete ffc; // 可删除

结论就是,加上var 和没加 var的声明全局变量是有区别的。

使用var语句重复声明语句是合法且无害的。如果重复声明且带有赋值,那么就和一般的赋值语句没差别。如果尝试读取没有声明过的变量,Js会报错。
JavaScript的函数作用域内,声明的变量或内部函数,在函数体内都是可见的。意味着,函数在定义之前可能已经可用。函数定义有两种方式,一种是函数定义表达式,一种是函数声明语句。

// 函数定义表达式 
var fns = function (){ 
// ... 
}; 
// 函数声明语句 
function fns(){ 
// ... 
}

函数声明语句“被提前”到外部脚本或外部函数作用域的顶部,所以以这种方式声明的函数,可以被再它定义之前出现的代码所调用。而函数定义表达式中,变量的声明被提前了,但是给变量的赋值是不会提前的,所以,以表达式方式定义的函数在函数定义之前无法调用。

(function() { 
testa(); // 打印出testa 
testb(); // 报错:提示undefined is not a function 
console.log(testc); //undefined,如果移到上面就可以了 
function testa() { 
console.log("testa"); 
} 
var testb = function() { 
console.log("tesb"); 
} 
var testc = "testc"; 
})();

当然,我们声明变量和函数,必须遵守基本的规范,变量和函数声明要提前。

Javascript 相关文章推荐
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
Nov 06 Javascript
学习ExtJS Window常用方法
Oct 07 Javascript
js制作的鼠标悬浮时产生的下拉框效果
Oct 27 Javascript
JQuery记住用户名和密码的具体实现
Apr 04 Javascript
node.js+express制作网页计算器
Jan 17 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
Jan 25 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
Jan 21 Javascript
jquery Form轻松实现文件上传
May 24 jQuery
vue中的过滤器实例代码详解
Jun 06 Javascript
细述Javascript的加法运算符的具体使用
Oct 18 Javascript
原生js实现购物车功能
Sep 23 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
Nov 04 Javascript
JavaScript的arguments对象应用示例
Sep 15 #Javascript
avascript中的自执行匿名函数应用示例
Sep 15 #Javascript
JavaScript function 的 length 属性使用介绍
Sep 15 #Javascript
css与javascript跨浏览器兼容性总结
Sep 15 #Javascript
一个通过script自定义属性传递配置参数的方法
Sep 15 #Javascript
一个字符串反转函数可实现字符串倒序
Sep 15 #Javascript
jquery实现类似淘宝星星评分功能有截图
Sep 15 #Javascript
You might like
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
js随机生成网页背景颜色的方法
2015/02/26 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
Vue组件开发初探
2017/02/14 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
pytorch masked_fill报错的解决
2020/02/18 Python
Python celery原理及运行流程解析
2020/06/13 Python
为什么称python为胶水语言
2020/06/16 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
银行服务感言
2014/03/01 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
探亲假请假条
2014/04/11 职场文书
住宅使用说明书
2014/05/09 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python