今天看jquery发现其框架参数传递很有意思(1.4.0以上版本)
(function( window, undefined ) {
//中间代码
})(window);
一般分析步骤:
1、词法分析
1.1 形成临时活动对象 AO {}
1.2 分析形参,参数作为 AO 属性,值为undefined,AO {window:undefined,undefined:undefined}
1.3 接收实参,AO {window:window,undefind:undefinde}
很明显执行的时候传入的参数少一个,查了一些资料:
原因:一些旧版本浏览器(IE5-,FF等)undefined竟然可以重新赋值,如undefined=3;
声明undefined局部变量又不传参数,值自然是undefined,防止了外界对undefined的污染。
传window的原因是加快内部查找变量的速度,关于window还有点疑问,先不写了
下面是chrom写的undefined的小测试
var undefined = "hello world";
var a;
if (a == undefined){
console.log("ok2");
}
console.log(a);
console.log(undefined);//输出 undefined
输出:
ok2
undefined
undefined
很明显我最新的chrom中普通undefined已经不能被重定义了
但是无聊的我发现匿名函数中依然可以
(function(window,undefined){
var undefined = "hello world";
var a;
if (a == undefined){
console.log("ok1");
}
console.log(a);
console.log(undefined);//输出hello world
})(window);
输出:
undefined
hello world
结论:匿名函数判断变量undefined有风险,想判需谨慎。