请教js中 (function(){})() 这种函数的用法

ugooo 2009-10-15 03:46:08

<script type="text/javascript">
(function(){
var r, url;
var s = location.href;
url = /http:\/\/www.csdn.com.cn/i;
if(s.search(url)>=0){
var head=document.getElementById("topHead");
head.style.width="990px";
}
})()
</script>


上面那段代码具体功能我了解,不明白这种形式的用法和好处,function为什么用一个小括号给包着,最后一个括号做什么用的,假如括号后面有没结束,要不要带上引号。这种写法这 叫什么写法,回调么?望大家赐教。
...全文
12698 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
anlaetion 2011-06-21
  • 打赏
  • 举报
回复
今天算是找到了....终于明白了....
shaoqing176033429 2010-04-09
  • 打赏
  • 举报
回复
d学习 很多东西还是不太明白
zhongjiekangping 2009-12-25
  • 打赏
  • 举报
回复
学习
loginnewman 2009-12-25
  • 打赏
  • 举报
回复
第一次见,学习
soloqwe 2009-12-25
  • 打赏
  • 举报
回复
回楼上:
(function(i)){...}(i)想象成定义之后马上调用
你看你第一个在后面调用的时候没有加入参数i导致函数内部调用的时候无值
相当于function(){alert(i);}里面的i根本没有定义过,当然是undefined。
而第二个虽说定义的时候用的是x,但是传进去的参数还是
不知道这个说法对吗
BriskJJ 2009-10-27
  • 打赏
  • 举报
回复
mark
moliu 2009-10-27
  • 打赏
  • 举报
回复
请帮忙比较这两种写法的区别
function f() {
var a = [];
var i;
for(i = 0; i < 3; i++) {
a[i] = (function(i){
return function(){
alert(i);
return i;
}
})();
}
return a;
}

var a = f();
a[0]();//undefined
a[1]();//undefined
a[2]();//undefined
---------------------------
function f() {
var a = [];
var i;
for(i = 0; i < 3; i++) {
a[i] = (function(x){
return function(){
alert(x);
return x;
}
})(i);
}
return a;
}

var a = f();
a[0]();//0
a[1]();//1
[2]();//2

moliu 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 blood_sakura 的回复:]
I couldn't enjoy it!请讲讲为什么不用闭包时 结果 是 1 、1 ,用了闭包结果就是 0、1 吗?

因为闭包引用的是父函数范围内的最终值
精通JAVACRIPT里面提到过这个问题
[/Quote]
闭包对父函数范围内变量的调用,是传址 refercence 而不是传值 value ,对吗?如果我的理解是正确的, 那么,这个问题就容易理解多了。我说到点子上了么?
moliu 2009-10-27
  • 打赏
  • 举报
回复
楼 上说得对,理解匿名的另外方法,开阔思路
  • 打赏
  • 举报
回复
括号表达式,写起来精简,另外匿名就执行了,不过这么写函数就没办法通用了。。。。
myerpso 2009-10-26
  • 打赏
  • 举报
回复
这样啊 明白了
blood_sakura 2009-10-26
  • 打赏
  • 举报
回复


I couldn't enjoy it!请讲讲为什么不用闭包时 结果 是 1 、1 ,用了闭包结果就是 0、1 吗?

因为闭包引用的是父函数范围内的最终值
精通JAVACRIPT里面提到过这个问题
hitlcyu19 2009-10-26
  • 打赏
  • 举报
回复
匿名函数
moliu 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 objector 的回复:]
这种方式叫函数的闭包(closure),可以让匿名函数立即被执行(最后面的那对括号就是让上面定义的匿名函数立即执行的秘密),这种闭包有以下几个优势或特点:
1. 减少了全局变量的个数,可以有效减少命名冲突
  原因是包在里面的变量对于外面来说是不可见的,他们的作用域近局限在匿名函数的函数体内
2. 这种方式可以保存闭包外面的变量的状态,这个特点还是举个例子比较易懂:
JScript codefunction fn() {for(var i=0 ; i<2; i++) {//(function(){var backup= i;
setTimeout(function() {
alert(backup);
},2000);//})(); }
}

fn();
上面代码的for循环一共两次,我们本来的目的是每隔两秒钟把每一次循环的索引(也就是i)输出,我们期待它应该输出:0和1,但是实际输出结果却是两次都是1
使用了闭包之后,我们会把循环中每一次i值的状态都保存下来,如下代码所示:
JScript codefunction fn() {for(var i=0 ; i<2; i++) {
(function(){var backup= i;
setTimeout(function() {
alert(backup);
},2000);
})();
}
}

fn();
这次我们得到了正确的结果:0和1

Enjoy!
[/Quote]
I couldn't enjoy it!请讲讲为什么不用闭包时 结果 是 1 、1 ,用了闭包结果就是 0、1 吗?
moliu 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kingwolf_javascript 的回复:]
function{return alert()}()//既然能这样。???
这是错误的

[/Quote]
好家伙,差点让他给蒙了,还真的以为能这样呢?试了几次,不行。哎!
moliu 2009-10-20
  • 打赏
  • 举报
回复
mark it,study it then
浴火_凤凰 2009-10-18
  • 打赏
  • 举报
回复
function{return alert()}()//既然能这样。???
这是错误的
Objector 2009-10-17
  • 打赏
  • 举报
回复
这种方式叫函数的闭包(closure),可以让匿名函数立即被执行(最后面的那对括号就是让上面定义的匿名函数立即执行的秘密),这种闭包有以下几个优势或特点:
1. 减少了全局变量的个数,可以有效减少命名冲突
原因是包在里面的变量对于外面来说是不可见的,他们的作用域近局限在匿名函数的函数体内
2. 这种方式可以保存闭包外面的变量的状态,这个特点还是举个例子比较易懂:

function fn() {
for(var i=0 ; i<2; i++) {
//(function(){
var backup = i;
setTimeout(function() {
alert(backup);
}, 2000);
//})();
}
}

fn();

上面代码的for循环一共两次,我们本来的目的是每隔两秒钟把每一次循环的索引(也就是i)输出,我们期待它应该输出:0和1,但是实际输出结果却是两次都是1
使用了闭包之后,我们会把循环中每一次i值的状态都保存下来,如下代码所示:

function fn() {
for(var i=0 ; i<2; i++) {
(function(){
var backup = i;
setTimeout(function() {
alert(backup);
}, 2000);
})();
}
}

fn();

这次我们得到了正确的结果:0和1

Enjoy!
moliu 2009-10-17
  • 打赏
  • 举报
回复
有点像汉语某些词的特殊用法,老外们是看不懂的
maddemon 2009-10-15
  • 打赏
  • 举报
回复
补充一下
就算你写了方法名也不能直接() 所以要加一个括号(function(){}) 这样就是一个表达式。就在后面加()执行了

这种写法主要是为了避免变量污染

加载更多回复(10)

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧