|
|
大家在前端开发中对闭包应该和熟悉了,也就是几种常见的闭包方式:
1:
var fn = function(i){ var j = i; return function(){ return j; }}
2:
(function(undefined){ //do something})
...
今天主要说的是2这样闭包方法中传参数问题,在各种前端js框架中经常也会见到这样代码,如果不仔细分析真的很难想到这样使用的用意。
(function(undefined){ //do something})() //1
在闭包行参使用undefined而不是从外部1处传入参数,这样做是考虑到在undefined在外部被赋值情况,那么这时候在闭包内部使用undefined就会出现问题了,那么就需要
if(typeof undefined === 'undefined') {// } 判断。在外部不传参数情况下,闭包内部使用形参在没有赋值时undefined将会保持原本含义,这是由JavaScript 作用域规则决定。
为了不让内部的undefined不会被污染,在形参中默认加上undefined,所以在jquery等js库源代码会看到
(function(window,undefined){ //todo something})()
这样代码。在形参中传入默认window也是;类似一样的原理。
最后可以测试下:
var undefined = 123;(function(undefined){ console.info(undefined);})() //在参数中传入undefined和不传情况下会输出什么?
参考:
http://www.iamued.com/qianduan/1450.html |
|