javascript闭包

来源:互联网 发布:linux 安装oracle12c 编辑:程序博客网 时间:2024/05/16 10:09

问题一:

<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

0 0
原创粉丝点击