<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为什么用一个小括号给包着,最后一个括号做什么用的,假如括号后面有没结束,要不要带上引号。这种写法这 叫什么写法,回调么?望大家赐教。
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";
}
})
声明了一个匿名函数
加个()执行它
a() //执行该方法function{return alert()}() //直接执行该方法
function{return alert()}()//既然能这样。 并不能这样,你没写方法名 不对滴
(function{return alert()})()//为什么还要这样.
就算你写了方法名也不能直接() 所以要加一个括号(function(){}) 这样就是一个表达式。就在后面加()执行了这种写法主要是为了避免变量污染
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和1Enjoy!
这是错误的
精通JAVACRIPT里面提到过这个问题
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
(function(i)){...}(i)想象成定义之后马上调用
你看你第一个在后面调用的时候没有加入参数i导致函数内部调用的时候无值
相当于function(){alert(i);}里面的i根本没有定义过,当然是undefined。
而第二个虽说定义的时候用的是x,但是传进去的参数还是
不知道这个说法对吗