var i = 0;
function fun() {
alert(this.i);
var a = 10;
}
fun(); // 0 --------------------------------1
alert(fun.a); // undefined ------------------2
1处: 为0我的理解是在i绑定在window对象中,当执行
fun()
时,this.i
相当于window.i
, 换句话说,i
是作为window
对象的一个属性2处: 那么,按照1处的理解,我觉得在在
fun
函数的内部,变量a
也应该是作为函数这个对象的一个属性,因此,我试着alert(fun.a)
,结果却undefined
为什么?,
-----------------------------问 题 更 新 ---------------------------
看了大家的回答,我是这样理解的:变量a
仅仅是函数局部作用域的一个局部变量而已,并非它的属性。随着fun
函数的执行而创建,随着fun
函数执行完毕而销毁。
我理解了结果,同时疑问也并没有消失!
我的疑问是:
变量
i
作为window对象的一个属性,那么a
也应该是fun
的一个属性。
或者:
变量
i
仅仅作为全局变量,而不是window对象的属性,这样a
作为一个局部变量
可事实是:
变量
i
是window的一个属性,a
却仅仅是fun
局部作用域中的一个局部变量
这就是我不理解的地方,难道是我过分追求这种“统一”的和谐思想吗?
第一点是对的。
第二点,你要分清局部变量和对象属性的区别。
var a = 10;
是局部变量,fun.a = 10
是fun
作为对象的属性。两者没有半毛钱的关系。函数其实也是对象的一个实例:
所以所有的函数,不管是通过
Function
构造还是自定义函数,也都是Object
的实例。所以,函数是可以作为对象定义属性和方法的!
可以看到,
b
确实是fun
本身的属性。----------------更新分割线----------------
@fcxh
作用域!
通过
var
这个关键字,将变量与它所储值的位置进行了绑定。在全局作用域使用
var
初始化变量,这个变量就会储存在全局变量的内存中,在浏览器中只要不关闭网页,全局变量所在内存的变量都不会被销毁。在函数内部使用
var
,变量会储存在‘临时’的内存中,当函数运行完毕后(不考虑闭包),这块内存中所有的变量都会被销毁。全局变量,局部变量不是从属的关系,它们占有不同的内存空间。语言中各种各样的设计都有它足够充分的理由,不只是要‘统一和谐’这么简单。