把问题拆开了来看吧 功能:/* 先说下面这句 1:koke要求是一个函数 2:每隔一秒执行这个函数一次 */ window.setInterval(koke,1000);在上面的前提下,我们再来搞清楚,你两个方法返回的koke到底到底是什么 在你两个方法中,将构造函数实例的注释掉,我们改成这样 alert(koke); //var t = new fire(); 此时,可以看到,第一个方法返回的是 function (){ var sta = 0;
alert(++sta);//重复执行
return function(){ console.log(++sta); //这句话为什么不执行? }; } 第二个方法返回的是: function (){ console.log(++sta);//这样既然可以不停的执行,好纳闷呀! }这样,就很明白了 1:你第一个方法返回的是koke自身,然后通过setInterval每隔一秒执行它自身;如果你先抛开var t = new fire();不理.把它换成koke();然后console.log(++sta); 没有被执行到,你会觉得奇怪么?2:你第二个方法返回值是以console.log为主体的一个函数,然后通过setInterval每隔一秒执行它.其等效于: var sta = 0; function log(){ console.log(++sta);//这样既然可以不停的执行,好纳闷呀! }; window.setInterval(log,1000); 如果把你第二个方法换成上面写的这样,你应该能理解为什么它可以不停的被执行吧? 然后再回过头来说,为什么第二个方法返回的值是那样 首先你需要了解一下自执行的匿名函数:(function(){函数体})();这样的写法会使得函数体被立刻执行var koke=(function(){你的函数体})() //它会先执行函数体,然后将函数体的执行结果返回给koke,函数体的执行结果就是:执行alert;return function (){console.log(++sta);} //所以,koke的最终结果是等于后面return 的那个函数
var t = new fire(); 意思:var t = {}; fire.call(t);第一次 koke 是一个function 所以每次调用 都要执行第二次 (function(){])(); 这个是匿名函数执行,返回一个 “(function(){ console.log(++sta);//这样既然可以不停的执行,好纳闷呀! });” 这是也是个function
同理 第二个先执行alert 之后返回函数交给koke 也就是说koke 并不是你定义的那个函数 二是返回的那个函数 之后交给setInterval一直执行返回的那个函数了啊
function fire() {
window.setInterval(function () {
var sta = 0;
alert(++sta);//重复执行
return function () {
console.log(++sta); //这句话为什么不执行?
};
}, 1000);
}
fire();
setInterval 似乎只是repeat 执行第一个参数的函数(不管你return 什么都不会影响它,也不会执行) function fire() {
window.setInterval((function () {
var sta = 0;
alert(++sta);//只执行一次
return (function () {
console.log(++sta);//这样既然可以不停的执行,好纳闷呀!
});
})(), 1000);
}
fire();
但是如果你传入的参数是个自执行函数 (function(){})() 的话,如果没有写return 函数,第2次执行时就会报错了。
而如果你写了return 函数,它将执行 return 后的函数 .
至于原理是怎么样,在这还请教各位大师了!!
第二个例子中 koke是一个立即执行的函数 它表达的意思是 返回一个未执行函数
然后结合setInterval 函数的使用 就是你能看到的情形了
功能:/*
先说下面这句
1:koke要求是一个函数
2:每隔一秒执行这个函数一次
*/
window.setInterval(koke,1000);在上面的前提下,我们再来搞清楚,你两个方法返回的koke到底到底是什么
在你两个方法中,将构造函数实例的注释掉,我们改成这样
alert(koke);
//var t = new fire();
此时,可以看到,第一个方法返回的是
function (){
var sta = 0;
alert(++sta);//重复执行
return function(){
console.log(++sta); //这句话为什么不执行?
};
}
第二个方法返回的是:
function (){
console.log(++sta);//这样既然可以不停的执行,好纳闷呀!
}这样,就很明白了
1:你第一个方法返回的是koke自身,然后通过setInterval每隔一秒执行它自身;如果你先抛开var t = new fire();不理.把它换成koke();然后console.log(++sta); 没有被执行到,你会觉得奇怪么?2:你第二个方法返回值是以console.log为主体的一个函数,然后通过setInterval每隔一秒执行它.其等效于:
var sta = 0;
function log(){
console.log(++sta);//这样既然可以不停的执行,好纳闷呀!
};
window.setInterval(log,1000);
如果把你第二个方法换成上面写的这样,你应该能理解为什么它可以不停的被执行吧?
然后再回过头来说,为什么第二个方法返回的值是那样
首先你需要了解一下自执行的匿名函数:(function(){函数体})();这样的写法会使得函数体被立刻执行var koke=(function(){你的函数体})()
//它会先执行函数体,然后将函数体的执行结果返回给koke,函数体的执行结果就是:执行alert;return function (){console.log(++sta);}
//所以,koke的最终结果是等于后面return 的那个函数
clock = window.setInterval(koke(),1000);
return (function(){
console.log(++sta);//这样既然可以不停的执行,好纳闷呀!
});第2个问题:
你的 koke 相当于:
function(){
console.log(++sta);//这样既然可以不停的执行,好纳闷呀!
}
意思:var t = {}; fire.call(t);第一次 koke 是一个function 所以每次调用 都要执行第二次 (function(){])(); 这个是匿名函数执行,返回一个 “(function(){
console.log(++sta);//这样既然可以不停的执行,好纳闷呀!
});” 这是也是个function