+ -
当前位置:首页 → 问答吧 → 求助(function(){})()的意思?

求助(function(){})()的意思?

时间:2010-05-14

来源:互联网

现在看到不少javascript代码里有不少(function(){})(),我是个JS新手,谁能解释一下?哪有参考资料?谢谢!
如JQUERY里的
复制内容到剪贴板
代码:
(function( window, undefined ) {
.........
})(window)
其它的如
复制内容到剪贴板
代码:
CKEDITOR.loader = (function()
        {
..........
})()
[ 本帖最后由 gorila 于 2010-5-22 22:14 编辑 ]

作者: gorila   发布时间: 2010-05-14

闭包

作者: ONEBOYS   发布时间: 2010-05-14

封装JS函数 通过设置()内的数据来改变JS效果

作者: cwq2jxl   发布时间: 2010-05-14

参考:http://www.gracecode.com/archives/3004/
不过我的理解是:
复制内容到剪贴板
代码:
<script type="text/javascript">
//这里写容易理解吧^^
var fun1=(fun2=function(window,undefined){
       //context
       });
//然后1
fun1(window);
//然后2
(function(window,undefined){
       //context
       })(window);
</script>

作者: stri   发布时间: 2010-05-15

用通俗一点的讲就是在声明一个匿名函数后直接执行它,至于运行结果的变量,是通过参数来实现的

作者: hnyashiro   发布时间: 2010-05-15

声明一个马上执行的匿名函数,主要用于避免私有变量污染,是一种模块化的写法

作者: 我佛山人   发布时间: 2010-05-15

先纠正一下问题的标题:

应该是 (function(){})()的结构

如果写成这种形式:
var funcname=function(){……};
funcname();
则楼主应该不觉难懂了吧?

那么直接把funcname替换成function(){……},外面包一个括号(好让括号里的东西是一个整体),效果是不变的。

作者: bound0   发布时间: 2010-05-16

我也是新手,觉得解释得挺复杂滴

作者: mu0001   发布时间: 2010-05-16

js函数有多种写法,这个叫匿名函数,楼主可以去看js那本犀牛书,上面有介绍定义函数的几种基本方法。

作者: hero777   发布时间: 2010-05-17

应该是匿名函数吧

作者: QQ379699897   发布时间: 2010-05-17

找到了一篇文章:http://ued.alipay.com/2010/05/us ... rameter-in-closure/
引用:
引言

最常见的闭包 (Closure) 范式大家都很熟悉了:
       
(function() {
// ...
})();

很简单,大家都在用。但是,我们需要了解更多。
首先,闭包是一个匿名函数 (Anonymous function), 即是 (function() {}) 这部分。之所以要给 function 添加括弧是为了让它形成一个表达式 (expression), 有了表达式,并且确定它的类型是个函数 (Function 实例), 就可以直接调用它。所以,后面的一对括弧是可以工作的,它的意义是:我要调用 (call) 这个函数。

既然是函数调用,那就可以像一般的函数那样,在调用时传入参数。这就是本次讨论的话题。

传入 window 参数

(function(win) {
// ...
})(window);

这样做最直观的好处是书写便利:少写几个字。你可以在闭包内任何地方使用 win, 它都会指向 window 对象。另外,它有利于压缩减少最终代码的体积,经过压缩后 (如 Google Closure Complier), 所有的 win 都会被替换成形如 a 这样的简单变量。win 用得越多,减少的字节数也越多。

不过,便利的同时也会带来陷阱。在 IE 上,window 总是指向当前窗口对象,这个没有问题,但是在某些场景下,使用闭包内的 win 变量会导致拒绝访问错误 (Access denied). 重现方式大致是这样的:当页面引用其他域名的脚本,并且该脚本调用了闭包内的 window.document, 而且这个闭包代码是来自另一个域名的脚本。在这种情况下,使用 win 会保持对 window 最早的引用,通过另一个域的脚本访问 win 会导致 IE 认为脚本产生了跨越冲突,从而拒绝了对 win.document 的访问。解决办法是不使用形参 win, 而是直接使用 window. 需要说明的是,给闭包传入 document 也会导致 IE 出现同样的问题。
传入 undefined

其实把 undefined 作为形参就,实参就可以不用传了,因为 JavaScript 中访问未传入的参数就会得到 undefined. 因此,你可以这样写:

(function(undefined) {
// ...
})();

和上面的讨论一样,你可以在闭包内任何地方使用 undefined, 可以少写几个字(如果把 undefined 换成更短的名字),也可以在减少压缩后体积。

另一个的优势是,你可以认为它是个变量,把它当变量来使用,它的值恒等于 (===) 真正的 undefined. 当外部代码意外地定义了 undefined 的时候——不常见,但确实可能会发生——你可以正常地使用真正的 undefined, 而不会被外部的 undefined 意外影响. 这是由 JavaScript 作用域规则决定的。
无论是否使用这个 undefined 参数,都应该避免使用 undefined 的字符串常量,如:
       
if(typeof myVar === 'undefined') {
// bad part...
}

因为如果你把字符串写错了,机器不会告诉你,而且会产生一个难以检查出来的bug. 幸运的是,对于 JavaScript 来说,JsLint 可以帮你做这个校验。当 myVar 已定义的时候(通过形参或 var 声明),上面的代码改成这样会更易于调试:
       
if(myVar === undefined) {
// good part...
}
结论

从上面两个例子来看,我们建议不要传入 window, 但是可以安全地使用第二种方式 (写 undefined 形参);我们还要尽量避免使用字符串常量。
最后,最重要的是,这只是两个特定对象和类型的讨论,举一反三,你会更了解 JavaScript

作者: gorila   发布时间: 2010-05-17

热门下载

更多