变量和属性在javascript中的区别
在很多文章中都说变量其实就是属性,但是它们之间有一定的区别,例如:
在全局作用域下,
var a = "hello";
b = "hello";
从字面上看,它们的区别是一个前面加了var,一个没有;它们的相同点都是全局的;
那么a称之为变量,只不过它是全局变量;
b称之为属性,它是window对象的属性,因为在全局作用域下,浏览器默认会创建一个window对象,凡是通过全局定义的类似b = "hello",那么b称之为window对象的一个属性,你可以在chrome的console下打印window.b,结果是hello。
还有一个差别是变量不可以通过delete进行删除,但是属性可以通过delete进行删除;
执行下面的动作:
delete a;
a;"hello",说明a没有被删除;
delete b;
b; undefined, 说明b已经被删除了。
再举下面的例子来说明他们之间的另一个细微的差别:
运行下面语句之前并没有对mynamespace进行声明。
var myNameSpace1 =myNameSpace1 || {};
myNameSpace2 = myNameSpace2|| {};
运行之后你会发现第一行语句可以运行成功,并且myNameSpace1= {};
但是第二行会抛出exception,出现myNameSpace2is not defined.
首先区分一下undefined和 xxxis not defined,这两个是不一样的,如果一个变量是undefined,那么说明这个变量被声明了,只是没有被定义,不知道用来干什么,但是它是有值的,为undefined。
var a; 打印a的值为undefined。
但是xxxis not defined是从来没有在内存中出现过的东西,如果你要打印它或者用它,都会接收到异常。
举一个现实中的例子,undefined表示你已被某个公司录用,但是还没有给你工号,以及分配部门,但是你去前台登记以及进入部门都是可以被允许的;
xxxis not defined是一个陌生人在公司了,会直接被保安挡住。
回到刚才var myNameSpace1 = myNameSpace1|| {};例子上,为什么它可以通过,是因为执行的时候,首先执行var myNameSpace1, 那么系统会把此myNameSpace1变量设为undefined,等号后面再取myNameSpace1会在全局环境下找变量myNameSpace1,发现myNameSpace1是undefined,所以一个undefined的变量可以赋值给其他变量。
myNameSpace2 =myNameSpace2 || {};执行失败的原因如下:
等号前面的myNameSpace2,javascript会把它当成是window对象的属性;
而等号后面的myNameSpace2,会把它当成是一个变量;
那么把myNameSpace2变量的值赋给window对象的属性myNameSpace2,就会出错,是因为myNameSpace2变量从来没有被声明过,所以会产生异常。