2016-04-22 59 views
1

因此,可以說我在JavaScript中定義的字符串:執行字符串作爲一塊的HTML/JavaScript代碼

var s = "function();" 

我可以執行代碼,如果我知道這個字符串的值?

如果是,那麼我可以在一個字符串內有多個命令嗎?例如:

var k = "function(); a = a + 1;" 

在此先感謝

+0

使用'的eval()'... [檢查這裏](https://developer.mozilla.org/en-US/docs/We B/JavaScript的/參考/ Global_Objects/EVAL)... –

回答

1

您可以使用eval,並且會執行多條語句。 但是,使用eval通常是一個壞主意。在大多數情況下,您可能可以完成任何您試圖做的事情,而不需要eval

eval如果與用戶提供的代碼一起使用(如來自表單或URL的內容),則可能會相當危險。它打開你達Cross-Site Scripting (XSS) attacks。只是避免它是最好的行動方式,因爲this answer提到,在將其輸入eval之前對輸入進行消毒不是直截了當,而且很容易出錯。

使用eval時出現的其他幾個不太重要的問題是它使代碼難以調試,而且速度很慢。如果瀏覽器不像其他代碼那樣對其進行優化和/或緩存,它也很難實現。

更新

我很驚訝,我忘了提及這個,當我最初回答了這一點,但明確地使用eval說法是不是唯一的方法eval在JavaScript調用。通過code instead of a function referencesetTimeoutsetInterval將隱式評估該代碼。

// This evals: 
setTimeout("doSomething()", 1000); 
// This does not eval: 
setTimeout(doSomething, 1000); // also shorter :) 

雖然不完全一樣eval,則Function constructor也有similar security concerns associated with it

let xss = 'alert("XSS")'; 
 

 
// whatever is in the string passed to Function 
 
// becomes the body of the function 
 
let doSomething = new Function(xss); 
 

 
document.querySelector('button').addEventListener('click', doSomething, false);
<button>Do Something</button>

正如eval,應注意當使用字符串作爲輸入setTimeoutsetIntervalFunction構造,特別是當用戶輸入將被傳遞到上當。

另見:

0

您可以使用eval()來評估/執行JavaScript代碼/表達式:

var k = "var a = 0; alert(a); a = a + 1; alert(a);" 
 
eval(k);

0

eval功能將評估一個傳遞給它的字符串。它是。這是因爲要評估的代碼必須在現場解析,因此需要一些計算資源。