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

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执行,我发现是构造函数才和原代码是一致的。所以第一反应是否这本书出错了?但是我想经得起考究的书不应该错,那可能是我错了,那么想请各位大神帮我解决下这本书这个形容是否有问题。

arlenhui
浏览 2472回答 4
4回答

幻_影

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

风萧萧梦潇潇

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

幻_影

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

Mery丶Louis

eval里面能执行函数,别用eval
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript