Example
1 | function myCallback(a, b) |
错误传参方法
1 | var intervalIDWrong = window.setInterval(myCallback('parameterWrong1', 'parameterWrong2'), 5000, ); |
Wrong way, it will eval and excute myCallback(‘parameter2’) immediately, and return undefined to window.setInterval as first parameter actually
运行后发现,参数会被立即打印出来,这是因为func并不是setInterval的回调函数,因为func会立即执行(也就是网址会被立即打印的原因),实际传递给setInterval的是func的返回值(当然它的返回值为undefined)。
因为是通过eval
立即执行myCallback,所以有些设置有较高安全Content Security Policy的网页上会报错:
1 | VM1417:1 Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self'". |
Solution 1 third parameter of window.setInterval
If you don’t need to support IE
var intervalID = window.setInterval(myCallback, 5000, 'parameter1-1', 'parameter1-2');
由于IE9和IE9以下浏览器不支持第三个参数,所以较早的教程很少教程。
Solution 2 a wrapper function
If you want to support IE <=9
var intervalID2 = window.setInterval(function() {myCallback('parameter2-1' , 'parameter2-2');}, 5000);
- setInterval第一个参数是一个匿名函数。
- 此匿名函数执行后返回一个函数,返回的函数才是真正传递给setInterval的回调函数。
- 根据作用域与作用域链的原理,返回的函数可以使用通过外层函数传递进来的参数。
- 于是可以正常打印出传递的参数。
Solution 3 Function.prototype.bind() method
If you want to support IE <=9
now with ES5, bind method Function prototype: Function.prototype.bind()
var intervalID3 =setInterval(myCallback.bind(null, 'parameter2-1' , 'parameter2-2'), 5000);
Solution 4 替换掉IE内置的setTimeout/setInterval
时至此刻,要想在IE下也能使用,就只有替换掉IE内置的setTimeout/setInterval方法了。如下:
1 | (function(){ // reset timer for IE |