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





为什么要传入 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不可改变。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值