javascript,jQuery自执行函数(匿名函数)为什么要把windows, jQuery, undefined作为参数传进去

来源:互联网 发布:时时彩软件urssc 编辑:程序博客网 时间:2024/06/05 14:16




为什么要传入 window ?

1. 可以提高程序效率
       为什么能提高效率,得从javascript的机制说起,所谓的scope chain作用域链,在当前作用域中如果没有该属性(局部变量)则向上一层作用域中寻找,一直到最上层,也就是window,查找速度慢。也就是说全局变量和下级作用域都是window的一个属性,向下依此类推。通过传入window变量,使得window 由全局变量变为局部变量,当在 jQuery 代码块中访问 window时,不需要将作用域链回退到顶层作用域,这样可以更快的访问window,查找速度快;
2. 压缩代码时可以进行优化
        将window 作为参数传入,可以在压缩代码时进行优化,例:(function( a , b) {} )(window); // window 被优化为 a ;


为什么要传入 jQuery?


 1.  首先函数会构建作用域,把jQuery传进去,可以减少作用域查找,提高js执行速度。
       如果不把jQuery当参数传递,则你使用变量jQuery/$的时候,首先会在函数体内查找,然后进fn查找,最后到window下查找。
 2. 而你把jQuery传进去之后,则只需要在函数体内查找$即可。
    如果以后依赖的是Zepto/jqlite,你只需要改下参数就行了,在这种极端的情况下,降低了代码修改和可复用成本。jQuery 被应用在成千上万的 JavaScript 程序中,必须确保 jQuery 创建的变量不能和导入他的程序所使用的变量发生冲突。

 

为什么要传入 undefined

   js本身有一个bug:undefined能被重写!!

undefined是window下的一个属性,非保留字,非关键字,可以被重写。

为什么undefined被重写会很危险呢,看下面的代码:

(function (undefined) {    let a;        // 如果a没有值则为a赋值.  但因为undefined被重写了,所以这句根本执行不到。    if (a === undefined) {        a = 'b';    }})(true);

在自调用匿名函数的作用域内,为防止undefined被修改,确保undefined是真的未定义,形参设undefined, 传入空值。因为undefined能够被重写,赋予新的值。

undefined ="now it's defined";
alert( undefined );
浏览器测试结果:

ie8 now it's defined 可以改变
firefox22 undefined 不能改变
chrome31 undefined 不能改变
opera12 undefined 不能改变
我的IE最高版本是 8,不知道高版本如何。除了 IE,其他的浏览器都默认 undefined不可改变。
阅读全文
0 0
原创粉丝点击