JavaScript里有无var声明你了解多少?
来源:互联网 发布:sql join用法 编辑:程序博客网 时间:2024/06/07 01:14
Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是:
(function(){ // ...})();
说明:有很多小伙伴不知道最后一个括号有什么意义,其实等价于<=>
function 函数名(){};函数名();
也就是声明函数后并进行了调用。
大家都看了很多文章,都说避免隐式声明全局变量,就是说声明变量前必须加’var’,那加了’var’和不加’var’到底有啥区别呢?
先来看一段代码
var a = 'aa';alert(a); //弹出 'aa'alert(window.a)//弹出'aa'
明白了吧,你声明一个全局变量其实是给’window’对象增加了一个属性,下面一段代码有相同效果
a = 'aa';alert(a); //弹出 'aa'alert(window.a)//弹出'aa'
那”var a = ‘aa’ ” 和 “a = ‘aa’ ” 都是全局变量,有啥区别了? 看下面两段段代码
var a = 'aa';delete window.a; // false a = 'aa';delete window.a; // true
都是为’window’对象增加了属性,一个可以删除,一个不能删除。但是加上’var’就可以作用域相关了,不加’var’始终都是在为’window’对象动态添加属性,以下代码为证
var test = function(){ a = 'aa';}test();alert(window.a);//弹出'aa'
由于window对象是全局对象,因此默认可以不加,下面这段同样效果
var test = function(){ a = 'aa';}test();alert(a);//弹出'aa'
说到这,认真思考的同学现在必然有个疑问, 为啥隐式声明的全局变量可以删除,显式声明的全局变量就无法删除?
原因是”delete 不可以删除那些可配置性为false的属性” ,某些内置对象的属性是不可配置的,比如通过变量声明或者函数声明创建的全局对象的属性,以下代码为证
delete Object.prototype; // false 不可删除,该属性是不可配置的var a = 'aa';delete window.a;//false 不可删除,该属性是不可配置的function test(){};delete window.test;//false 不可删除,该属性是不可配置的
那这样不就明白了,通过’var’声明的全局变量,其实际上是为’window’对象增加了一个不可配置的属性, 而不加’var’声明的全局变量,其实际上是为’window’对象增加了一个可以配置的属性。
注意了,以上使用window的地方,window都可以用this代替,如:
var test = function(){ a = 'aa';}test();alert(this.a);//弹出'aa'
0 0
- JavaScript里有无var声明你了解多少?
- JavaScript中声明变量有无var
- JavaScript中的Boolean,你了解多少?
- JavaScript中的Boolean,你了解多少?
- JavaScript中的Boolean,你了解多少?
- javaScript中document.getElementById 你了解多少?
- javascript中的面向对象,你了解多少?
- 【JavaScript声明符号var】
- Javascript变量声明:var语句
- javascript var声明变量提升
- 端口,你了解多少!?
- 你了解WINX多少?
- 你了解WINX多少?
- 你了解WINX多少?
- 你了解WINX多少?
- SQL你了解多少
- Adapter你了解多少?
- onSaveInstanceState() 你了解多少
- 万事起于忽微,量变引起质变
- OSGI企业应用开发(十)整合Spring和Mybatis框架(三)
- Objective-C开发编码规范
- 一篇很全面的freemarker教程
- Google服务器架构图解简析
- JavaScript里有无var声明你了解多少?
- mysql在linux下的安装
- String ,StringBuffer ,StringBuild 区别
- 脏读、幻读、不可重复读 小结
- 每天一个Linux命令-sed
- DropDownList获取value与text
- react-native-beautiful-video-recorder 视频记录器组件
- Different type of processor
- Docker多步构建更小的Java镜像