评论
学习了 回复 引用 查看
var test = 3; // 这种其实创建的是一个variable
test = 3; // 这种其实是在global下创建一个property
window.test = 3; // 同上一种,但通用性不好,不在浏览器环境下会出问题
所以比较正统的符合ECMA的应该是Global.test = 3;
但是一般来说Global是访问不到的,那么就得想办法弄出来
按ECMAv3的标准来说,正常调用一个函数的话,其内部的this就是Global,所以这么写
var global = (function() { return this; }());
但是ECMAv5又出了一个strict模式,在该模式下,如果正常调用一个函数,其内部的this是undefined
好在ECMAv5里又有indirect eval call,这在你的另一篇中有提到过,indirect eval call永远在global下执行,所以那个时候的this就是Global了
var global = (1,eval)('(this)');
所以综合一下,获取global的方法是:
var global = (function() { return this || (1,eval)('(this)'); }());
再随后global.tes = 3;就安全了 回复 引用 查看
相关的一些资料:http://perfectionkills.com/unnecessarily-comprehensive-look-into-a-rather-insignificant-issue-of-global-objects-creation/ 回复 引用 查看
这两种都是在VariableObject上添加一个属性.区别是一个具备可删除特性,一个不具备这个特性.
不过早期的firefox,大概是2之前的版本,有一个实现上的bug.多某个标识符赋值,可能会发生特性上的修改,比如本来具备不可删除特性的,变量,会因为赋值运算,导致该属性的 不可删除特性被去掉.
对于获取global这个事, Gray Zhang,已经开始考虑严格模式了?
另外楼主提到的 ie下 in 和 for in 的区别,确实是ie实现上的bug.
我个人对这个with打开闭包的说法,持反对态度. 我认为爱民大哥,之所以在其语言精髓与编程实践中有这一说发,源自于当时他对闭包概念的错误理解. 所以这一说法是不恰当的.
回复 引用 查看 @Franky
strict模式其实很多思想蛮合理的,比如不要不使用var来定义全局变量,以及不要随意删除属性等
而且使用Firefox 4.0的话,其Console在strict模式下会报出不少的warning可以便于检查代码
所以我现在写js一般是先加上'use strict',到上线的时候再去掉的 回复 引用 查看