最近开始阅读jquery的源码,首先先提炼出jquery的核心结构。
自执行函数
(function(window,undefined){
//...
})(window);
为什么传入window?
1.代码压缩
首先从代码压缩混淆的角度考虑,用线上工具来压缩混淆下面这段示例代码:
function test(){
var name="hello";
window.description="hi "+name;
}
压完混完后瘦了一点:
function say(){
var a="hello";window.description="hi "+a}
用a代替了name,但是window既不是声明的局部变量也不是参数,是不会被压缩混淆的。
所以将window作为参数传入可解决这个问题。将window作为参数传入,可以在压缩代码时进行优化,即参数名可以压缩变短。也可以在函数内另起个简短的变量名代替。
2.作用域
访问当前作用域下的变量比访问全局变量要快
如果不传入,每个语句都要去找一次window。如果将window作为参数传递过去,不要每个语句都去找window,提高了效率。
为什么要传入undefined?
undefined并不是作为JavaScript的保留关键字;undefined在IE8及以下中是可以对其重新赋值的
var undefined="new value";
alert(undefined);//alert “new value"
执行匿名函数的时候,只传递一个参数window,而不传递undefined,那么函数体中的undefined局部变量的值,刚好就是undefined
var undefined = 8;
(function( window ) {
alert(window.undefined); // 8
alert(undefined); // 8
})(window);
加了undefined后
var undefined = 8;
(function( window, undefined ) {
alert(window.undefined); // 8
alert(undefined); // 此处undefined参数为局部的名称为undefined变量,值为undefined
})(window);
在 自调用匿名函数 的作用域内,确保undefined是真的未定义。因为undefined能够被重写,赋予新的值.