; (function ($) { ……}(jQuery)); jquery 程序这样开头,这样结尾,什么意思?

2016-03-03 09:30:05 +08:00
 liushan

; (function ($) { ……}(jQuery)); jquery 程序这样开头,这样结尾,什么意思?
为什么不是这样?
$(document).ready(function(e) {

});

4814 次点击
所在节点    jQuery
18 条回复
shunia
2016-03-03 09:34:21 +08:00
怕有人瞎搞,在运行过程中,把$换了。用方法包一下,可以尽量保证方法体里的$都是 jQuery 。
所以就是:把不可控尽量变得可控。
plqws
2016-03-03 09:36:42 +08:00
前者是一个纯粹的自执行函数,后者只是一个 DOM 渲染完毕的回调
hansnow
2016-03-03 09:42:09 +08:00
document ready 的话,可以看官方文档
https://learn.jquery.com/using-jquery-core/document-ready/

// Shorthand for $( document ).ready()
$(function() {
console.log( "ready!" );
});

为啥这样开头和结尾不知道
jugelizi
2016-03-03 09:43:14 +08:00
JavaScript 库使用 $ 作为函数或变量名,在 jQuery 中,$ 仅仅是 jQuery 的别名。
demo
2016-03-03 09:47:07 +08:00
yuankui
2016-03-03 09:47:56 +08:00
搭车问下

function() {
//do somthing
}()

这样做是什么意义?
dangyuluo
2016-03-03 09:48:24 +08:00
@yuankui 按我的理解,是不让局部变量污染全局变量。
demo
2016-03-03 09:53:06 +08:00
简单说就是全局命名空间污染与 IIFE (Immediately-Invoked Function Expression ,立即执行的函数表达式),可以看: http://suqing.iteye.com/blog/1981591/
codegeek
2016-03-03 09:57:24 +08:00
1.最前面的分号是为了避免文件合并时出现错误,因为有的代码风格结尾不喜欢用分号;
2.把代码放在一个匿名的立即执行函数闭包里,避免全局变量污染;
3.传 jQuery 而不是别民,是为了确保传入的是 jQuery,毕竟还有其他的库也是用$。
mmzer
2016-03-03 10:04:59 +08:00
@codegeek 此楼正解!
sciooga
2016-03-03 11:00:24 +08:00
@yuankui
你是不是写错了?应该是这样吧

(function() {
//do something
})()

同样是为了避免全局变量污染,这种自执行的函数有好几种写法。
1. 楼主说的 (function(){ /* code */ }()) 这种最常见了。
2. 我认为你想表达的 (function(){ /* code */ })()
3. 运算符(! + ~ -)开头的 !function(){ /* code */ }()

最后如果你没有写错那我觉得你那样写并没有什么特别的意义。
jsonline
2016-03-03 11:05:25 +08:00
归根结底,是因为 JS 只有函数作用域,没有块级作用域。
v1024
2016-03-03 11:14:55 +08:00
; (function ($) {

}(jQuery));

1. 开头的; 是为了防止与其他代码合并时的错误
2. 用(function(){})(); 包装,保证内部变量不污染全局
3. $ 和 jQuery ,是为了保证 $指代 jQuery ,因为有可能$ 被别人覆盖掉
lwbjing
2016-03-03 11:36:02 +08:00
嗯。上面都说了。。
br00k
2016-03-03 11:36:49 +08:00
jQuery(function ($) {})
yuankui
2016-03-03 13:00:47 +08:00
@sciooga 嗯,写错了,会意即可.
juxingzhutou
2016-03-03 13:31:19 +08:00
我觉得可以把这个理解为一个语句块,类似 C 风格的
```
{
$ = jQuery;

//使用 jQuery 的代码
}
```
vincenttone
2016-03-03 13:48:46 +08:00
(function ($) { ……}(jQuery));

我们分解一下:

var xxx = function ($) {.......};
xxx(jQuery);

这里只是一口气写成了(function ($) { ……}(jQuery));

所以这里定义了一个匿名函数并调用了它,也不用声明 xxx 这个变量了。

那为什么不这样写呢?:

var $ = jQuery;
........

很明显怕有污染,假设我写了一段代码:

var $ = 1;

var $ = jQuery;
........

$++;

这样会死。。。吧?

那我们这么写:

var $ = 1;

var xxx = function ($) {.......};
xxx(jQuery);

$++;

或者干脆:

var $ = 1;
(function ($) { ……}(jQuery));
$++;

就应该没事了。

ps.我日常不写 js ,规范神马的不知道, so ,规范问题就不要指出了。。。语法或者内容有问题欢迎。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/260692

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX