您的位置:首页 > Web前端 > JQuery

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

2017-05-25 17:33 393 查看
为什么要传入 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);


在自调用匿名
4000
函数的作用域内,为防止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不可改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: