问题一:
<script>
function say667(){
var num = 666;
return function(){
alert(num);
}
num++;
alert(num);
}
var sayAlert = say667();
sayAlert();
</script>
问题二:
function say667() {
var num = 666;
var sayAlert = function() { alert(num); }
num++;
return sayAlert;
}
var sayAlert = say667();
sayAlert()
问题一:为什么会弹出666,而不是666,再弹出667.
问题二:与问题一(弹出666)相比,为什么会弹出667
solution:
问题一,var sayAlert = say667();,在say667() 函数中执行了 return function(){alert(num); }后面的代码没有执行,并且sayAlert这个变量就是function(){alert(num); }函数,所以只会弹出666。
问题二,var sayAlert = say667();,在say667()函数中 var sayAlert = function() { alert(num); }只是定义sayAlert是个函数,而并没有执行,当执行sayAlert();的时候才弹出667
这里是百度lmy_sk521 网友的答案;
我想补充一点的是:这里的无论是第一还是第二个问题,say667();这个条语句都是触发了对应的say667()的方法的。
第一种执行到return,然后就把执行方法体的语句返回了。后面的语句不执行。
第二种也是执行到return,但是这儿返回的是赋值后的函数体对象。(类似于包含了语句的程序对象。但是不执行。
方法体只进行了“=”操作,只有等到下次调用该方法体对象才执行。)
方法体的赋值语句都是不执行的,直接返回含了语句的程序对象......
更详细的闭包解释和例子可以参考http://www.cnblogs.com/hongchenok/p/3588030.html