为了账号安全,请及时绑定邮箱和手机立即绑定

javascript权威指南中对setTimeout()传入字符串参数的描述是否正确?

javascript权威指南中对setTimeout()传入字符串参数的描述是否正确?

arlenhui 2015-05-30 15:51:13
setTimeout()的第一个参数可以作为字符串传入。字符串会在指定的超时时间或间隔之后进行求值(相当于eval)。其中相当于eval这种描述正确吗?我们先看一个例子var name = "Bob";  var nameObj ={      name : "Tom",      showName : function(){          alert(this.name);      },      waitShowName : function(){         var that = this;         setTimeout("that.showName();", 1000);      } }; nameObj.waitShowName();然后与下面两个进行对比var name = "Bob";  var nameObj ={      name : "Tom",      showName : function(){          alert(this.name);      },      waitShowName : function(){         var that = this;         eval("console.log(that)");      } }; nameObj.waitShowName();var name = "Bob";  var nameObj ={      name : "Tom",      showName : function(){          alert(this.name);      },      waitShowName : function(){         var that = this;         (new Function("console.log(that)"))()      } }; nameObj.waitShowName();想必大家应该很清楚我的意思了,eval执行和new Function执行,我发现是构造函数才和原代码是一致的。所以第一反应是否这本书出错了?但是我想经得起考究的书不应该错,那可能是我错了,那么想请各位大神帮我解决下这本书这个形容是否有问题。
查看完整描述

4 回答

已采纳
?
幻_影

TA贡献2条经验 获得超0个赞

setTimeout和setInterval确实是把第一个参数的上下文环境变成全局作用域了,内部为何这样我也不清楚,感兴趣你可以去看下es标准,要是想改变函数指针,可以用apply

查看完整回答
反对 回复 2015-05-31
?
风萧萧梦潇潇

TA贡献2条经验 获得超0个赞

应该没有问题,setTimeout()在第一个参数为字符串时上下文为全局作用域,相当于全局作用域的eval。

查看完整回答
反对 回复 2017-04-29
?
幻_影

TA贡献2条经验 获得超0个赞

setInterval第一个参数如果是字符串的话就是按照eval解析的,传递的是函数指针,eval最好不用是出于安全方面的考虑,因为有可能会执行到非安全的恶意代码,如果你就是喜欢用的话,随你高兴

查看完整回答
反对 回复 2015-05-30
  • arlenhui
    arlenhui
    我知道出于安全最好不要用,但是应该有不可避免的情况要用吧。 我纳闷的是按照eval解析,作用域却改变了,导致和that处在不同环境中无法调用。
  • arlenhui
    arlenhui
    是因为在浏览器中setTimeout、setInterval和匿名函数执行时的当前对象是全局对象window的原因吗?参数传递过去是用eval解析,但是却因为setTimeout函数改变了作用域?
?
Mery丶Louis

TA贡献2条经验 获得超0个赞

eval里面能执行函数,别用eval

查看完整回答
反对 回复 2015-05-30
  • arlenhui
    arlenhui
    eval里面创建函数后,执行环境仍然是当前执行环境。而Function构造器构造的函数,由于没有对象会默认为window。我就是想知道setTimeout里面传入字符串后,setTimeout里面执行的情况到底是怎么样的。犀牛书是说历史原因,或许是js这门语言编写出来就没发现到这个点,到现在ES6也没有解决。你可以说说怎么回事吗
  • arlenhui
    arlenhui
    另外IE6.7在处理json字符串时还是用到eval吧,你的说法不成立
  • 4 回答
  • 0 关注
  • 2470 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信