javascript 中加’var‘和不加'var'的区别,你真的懂吗?

没看以前千万别说我是标题党,这个问题真的有好多淫都不懂!!!javascript

你们都看了不少文章,都说避免隐式声明全局变量,就是说声明变量前必须加'var',那加了'var'和不加'var'到底有啥区别呢?html

 先来看一段代码java

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' " 都是全局变量,有啥区别了? 看下面两段段代码this

var a = 'aa';
delete window.a; // false
a = 'aa';
delete window.a; // true

都是为'window'对象增长了属性,一个能够删除,一个不能删除。可是加上'var'就能够做用域相关了,不加'var'始终都是在为'window'对象动态添加属性,如下代码为证spa

var test = function(){
 a = 'aa';
}

test();

alert(window.a);//弹出'aa'

 因为window对象是全局对象,所以默承认以不加,下面这段一样效果prototype

var test = function(){
 a = 'aa';
}

test();

alert(a);//弹出'aa'

说到这,认真思考的同窗如今必然有个疑问, 为啥隐式声明的全局变量能够删除,显式声明的全局变量就没法删除?code

缘由是"delete 不能够删除那些可配置性为false的属性" ,某些内置对象的属性是不可配置的,好比经过变量声明或者函数声明建立的全局对象的属性,如下代码为证htm

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'

至于缘由,请查看鄙人以前写的文章 'this,this,再次讨论javascript中的this,超全面'

 

鄙人才疏学浅,有不足之处,欢迎补足

相关文章
相关标签/搜索