关于setTimeout、setInterval 遇到的小问题
发布在不积跬步无以至千里2016年3月18日view:1883BrettBat前端工程师面试
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

定时器问题


 setTimeout、setInterval 都可以传去两个参数,一个执行的东西,一个时间间隔。用法就不做过多解释了。
 执行的内容既可以是一个函数(方法),也可以是符合js语法规则,可被解析的字符串
  但是这里有一个问题出现了,那就是执行字符串内容的时候,那么就用到了另一个东西eval,以及一个作用域的问题。 这个函数可用来执行可被js解析的字符串的一个函数。
 在IE8-之前,eval、与window.eval的执行效果是一样,被执行的字符串中包含变量、方法(函数)之类的东西,会去从当前所在的作用域中查找,但是在IE9+、FF、chrome中就有区别了,代码如下:

javascript代码:

function a(){ window.eval('b()');
function b(){
alert('b');
}
}
a();

以上代码在IE8-中不会有问题,但是在IE9+、FF、chrome中却会报错,因为eval会从全局作用域中查找b,显然b是属于方法a的作用域中,由于js的特性,是无法访问的。

javascript代码:

function a(){
setTimeout('b()', 1000);
function b(){
alert('b');
}
}
a();

在看这段代码,IE7+、FF、Chrome同样会导致b找不到,这就是是有关于setTImeout的问题了,setTimeout是由window调用的,所以作用域也是全局的,那么执行的时候,理论上相当于调用window.eval,但是在IE7、8中为什么也报错呢? 接着往下看。 改成这样之后:
function a() {
setTimeout('b()', 1000);
function b() {
alert('b');
}
}
a();
function b() {
alert('外面的B');
}
就会弹出“外面的B”,这就说明,setTimeout强制改变作用域了,不单独是使用window.eval,或者eval执行字符串。


以上是我的理解,如果有错误,欢迎大家提出宝贵意见。(工作中的坑!!!)

评论
发表评论
2年前

function a(){ setTimeout('b()', 1000); window.b=function(){ alert('b'); } } a();

PUBLISHED IN
不积跬步无以至千里

前端知识积累,填坑,掉坑中。。。

我的收藏