亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 2540 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號