摘要: 隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的:// 定义三个全局变量var global_var = 1;global_novar = 2; // 反面教材(function () { global_fromfunc = 3; // 反面教材}());// 试图删除delete gl.. 阅读全文
posted @ 2013-05-31 18:40 龙则 阅读(360) 评论(0) 推荐(0) 编辑
摘要: 预解析:var散布的问题(Hoisting: A Problem with Scattered vars)JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。当你使用了一个变量,然后不久在函数中又重新声明的话,就可能产生逻辑错误。对于JavaScript,只 要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。看下面这个例子:// 反例myname = "global"; // 全局变量function func() 阅读全文
posted @ 2013-05-31 18:31 龙则 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 创建隐式全局变量的反例就是使用任务链进行部分var声明。下面的片段中,a是本地变量但是b确实全局变量,这可能不是你希望发生的:// 反例,勿使用 function foo() { var a = b = 0; // ...}此现象发生的原因在于这个从右到左的赋值,首先,是赋值表达式b = 0,此情况下b是未声明的。这个表达式的返回值是0,然后这个0就分配给了通过var定义的这个局部变量a。换句话说,就好比你输入了:var a = (b = 0);如果你已经准备好声明变量,使用链分配是比较好的做法,不会产生任何意料之外的全局变量,如:function foo() { var a, b... 阅读全文
posted @ 2013-05-31 18:08 龙则 阅读(126) 评论(0) 推荐(0) 编辑