Js不像其餘語言強制要求;號結尾否則編譯不過,緣由是JS有自動;號的插入。chrome
var text=function(){} text()
這樣你不加;號也能運行其實在內部js是須要;號去幫助解析的編程
var text=function(){}; //沒有;號解析報錯,JS則自動加入;號
而後JS插入;號有一個固定的規則,但這規則並不能適用於任何場景就會把;號插亂。
結論
建議絕對不要省略分號,同時也提倡將花括號和相應的表達式放在一行,對於只有一行代碼的 if 或者 else 表達式,也不該該省略花括號。這些良好的編程習慣不只能夠提到代碼的一致性,並且能夠防止解析器改變代碼行爲的錯誤處理。瀏覽器
這並非eval 很差而是由於容易被用錯。
eval只是一個普通的函數,只不過他有一個快速通道通向編譯器,能夠將string變成可執行的代碼。有相似功能的還有Function , setInterval 和 setTimeout。
一、 eval不容易調試。用chromeDev等調試工具沒法打斷點調試,因此麻煩的東西也是不推薦使用的…
二、說到性能問題,在舊的瀏覽器中若是你使用了eval,性能會降低10倍。在現代瀏覽器中有兩種編譯模式:fast path和slow path。fast path是編譯那些穩定和可預測(stable and predictable)的代碼。而明顯的,eval不可預測,因此將會使用slow path ,因此會慢。
還有一個是,在使用相似於Closure Compiler等壓縮(混淆)代碼時,使用eval會報錯。
(又慢又報錯,我還推薦嗎?)
三、關於安全性,咱們常常聽到eval是魔鬼,他會引發XSS攻擊,實際上,若是咱們對信息源有足夠的把握時,eval並不會引發很大的安全問題。並且不光是eval,其餘方式也可能引發安全問題。好比:
莫名其妙給你注入一個<script src="">標籤,或者一段來歷不明的JSON-P請求,再或者就是Ajax請求中的eval代碼…
因此啊,只要你的信息源不安全,你的代碼就不安全。不僅僅是由於eval引發的。
你用eval的時候會在乎XSS的問題,你越在乎就越出問題,出的多了,eval就成噩夢了。
四、效率問題是程序邏輯問題。對於一些有執行字符串代碼需求的程序中,不用eval而用其餘方式模擬反而會帶來更大的開銷。安全
誰調用我,我就指誰。new 誰指誰。函數
function fn1(){ }; var text=setTimeout(fn1,1000);
這裏要注意的是這二個函數的 第一個參數(fn1)都會把this指向window還有第一個參數能夠爲string('fn1()')但不要這樣用由於這樣等於setTimeout 本身隱式使用了eval。工具
function fn1() { this.value = 42; this.method = function() { // 會將第一個參數的 this 指向全局對象 console.log(this.value); // 輸出:undefined }; setTimeout(this.method, 500); }
判斷的時候最好用===,由於js是弱類型用==的時候會本身去轉類型,那麼就可能致使出錯誤的判斷性能