技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> JavaScript --> 匿名函数中undefined形参疑问

匿名函数中undefined形参疑问

浏览:2340次  出处信息

唉,基本功不扎实,昨天在微博上问了个问题,就匿名函数中undefined形参,不知道是干什么用的。

经常看到这样的匿名函数代码:



;(function ( $, window, document, undefined ){


//函数体内具体代码


})(jQuery, window,document);



一般在很多jQuery插件中可以看到这类的代码。首先说说非常值得提倡的几点:

  1. 代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而引起合并后的语法错误。

  2. 匿名函数(function(){})();:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。避免函数体内和外部的变量冲突。

  3. $实参:$是jquery的简写,很多方法和类库也使用$,这里$接受jQuery对象,也是为了避免$变量冲突,保证插件可以正常运行。

  4. window, document实参分别接受window, document对象,window, document对象都是全局环境下的,而在函数体内的window, document其实是局部变量,不是全局的window, document对象。这样做有个好处就是可以提高性能,减少作用域链的查询时间,如果你在函数体内需要多次调用window 或 document对象,这样把window 或 document对象当作参数传进去,这样做是非常有必要的。当然你如果你的插件用不到这两个对象,那么就不用传递这两个参数了。

最后剩下一个undefined形参了,那么这个形参是干什么用的呢,看起来是有点多余。所以去微博上问了一下,感谢各位的解答,帮助,终于搞明白了。

首先看看ECMAScript对undefined的定义:未定义类型仅有一个值,称为 undefined。未必赋值的变量的值即 undefined

可是undefined 并不是js关键字,这样可以用作变量名;比如:



function a(){


var undefined = 5;


alert(undefined)


};


a();



运行一下,至少在IE,弹出来的是5,而不是undefined。也就是说全局的undefined有可能被覆盖。

在一些浏览器输出的undefined,比如高版本的firefox,chrome。看上去有点蛋痛,但这是真的,幸好,ECMAScript 5中undefined会变成只读属性,

15.1.1: The value properties NaN, Infinity, and undefined of the Global Object have been changed to be read-only properties.

这样就很好解释上面的匿名函数为什么要使用undefined这个形参了,因为这个匿名函数使用了$, window, document三个实参,undefined形参是没有任何值传入进来的,那么这里的undefined是真正的undefined,是window的undefined属性。这样写可以避免函数体内的undefined不会被外包重写。

唉,基本功不扎实啊,还是要多学基础知识!基础最重要!


建议继续学习:

  1. 深入理解PHP之匿名函数    (阅读:2547)
  2. javascript匿名函数    (阅读:2553)
  3. Javascript匿名函数解读    (阅读:1944)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1