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被重写会很危险呢,看下面的代码:
在自调用匿名
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不可改变。
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不可改变。
相关文章推荐
- javascript自执行函数为什么要把windows作为参数传进去
- javascript自执行函数为什么要把windows作为参数传进去
- 动态执行 javascript 函数(带参数)
- 关于setTimeout()的延时执行,JavaScript的异步、匿名函数、函数声明、函数表达式
- C++中把函数作为参数并执行
- javascript中函数作为参数调用的方法
- javascript委托的实-现 以带参数的函数作为参数的解决方法
- javascript 自定义函数 为什么不能执行
- 当call/apply传的第一个参数为null/undefined的时候js函数内执行的上下文对象是什么呢?
- JavaScript/JQuery自执行函数
- [Javascript][jQuery]图片预加载与可变参数函数
- 使一个函数作为另外一个函数的参数来运行的javascript代码
- 利用匿名函数向setInterval中执行的函数传递参数
- 我的javascript之路之基本类型和复杂类型作为函数的参数
- JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
- 献给和我合作的过得前端童靴们:jquery源码分析--核心函数(使用函数作为参数创建jQuery对象)
- javascript 函数参数之中的undefined(zz)
- 关于obj和基本类通过函数参数传进去执行是否改变原来的值
- JavaScript进阶系列02,函数作为参数以及在数组中的应用
- java类中用类的数组作为函数参数传给类,为什么不能直接对类的数组进行操作?