匿名函数是指没有指定函数名称的函数,先来看下面的例子:想想看结果是什么?
var a = function(t) { return t; }
(1 + 2).toString();
alert(a);
这里就是定义了一个匿名函数,传入参数(1+2)并且执行,然后赋值给变量a。因为在第一行没有写分号.看下面的例子你就理解了
var a =
1
+
3;
alert(
a);
闭包通常来讲可以简单的认为是可以访问一个函数里面的局部变量的另外一个函数。在下面的例子中,prop是在函数test里面定义的局部变量,正常调用完成之后不能再被访问,通过下面的方式可以在test函数执行完之后在后续的某个时间点继续访问test函数定义的局部变量,这就是闭包的一个简单示例。局部变量正常应该在方法执行完之后释放,但是这里的局部变量驻留在内存中。
function test(){
var prop = 1;
return function(){
return prop++;
}
}
var t = test();//outputs 1,因为prop++没有执行
alert(t());
alert(t());
以匿名函数的方式执行一个初始化,同时有起到隔离作用域的效果
(function(){
alert('anonymous');
})();
//同时传参数的例子
(function(v){
alert('anonymous ' + v);
})('test');
闭包函数体在外部函数执行的时候是不执行的:下面这个例子是比较好理解的。
function test(){
var prop = 1;
f = function(){
return prop++;
}
alert(prop);
}
var t = test();
下面的例子呢?alert(fa[0]);输出的是函数内容,{return i},可以看到函数体本身没有被替换成0,1,2...
function test(){
var arr = [];
for(var i =0; i< 5; i++){
arr[i] = function(){
return i;
}
}
return arr;
}
var fa = test();
alert(fa[0]);
alert(fa[0]()); //outputs is 5 ???
//定义及时执行,
for(var i =0; i< 5; i++){
arr[i] = (function(num){
return num;
})(i);//匿名函数同时也执行了
}
//定义及时执行,返回的是函数
for(var i =0; i< 5; i++){
//var ri = i;
arr[i] = (function(num){
return function(){
return num;
}
})(i);
}
闭包里的this指向的是window
function test(){
alert(this);
return function(){
alert(this);
}
}
var t = new test(); //alert object
t(); //alert window
//解决办法:
var that = this;
return function(){
alert(that);
}
闭包引起的内存泄漏,浏览器关闭才释放内存。(怎么验证??)
</head>
<body>
<span id='sid'>textspan</span>
<script type="text/javascript">
function test(){
var ospan = document.getElementById('sid');
ospan.onclick = function(){
alert(ospan.innerHTML);
}
}
test();
</script>
</body>
</html>
匿名函数自执行时定义对象,定义的对象用到了匿名函数的局部变量,但是对于这个对象来说,这个变量却是全局的。
(function(){
var v = 't';
Test = function(val){
v = val;//通过这种方式在每次 new Test的时候改变v
this.myVal = val;
this.getVal = function(){
return v;
}
};
})();
var oTest = new Test('value1');
alert(oTest.getVal());
var oTest2 = new Test('value2');
alert(oTest.getVal()); //对象oTest 值变成了value2