2017-03-13 103 views
1

如果我這樣做:爲什麼JS的eval()返回一個對象的唯一值

var x = eval('{a:"b"}); 
console.log(x); // -> "b" 

我得到的是對象(「B」)的值,而不是鍵/屬性,或整個對象本身很奇怪。

,但是當我這樣做:現在

var x = eval('(function self(){return {a:"b"}})()'); 
console.log('x'); // -> {a:'b'} 

似乎給我什麼,我所期望的,整個對象。但爲什麼呢?爲什麼我需要將它封裝在一個(自動執行)函數中?

我想用eval從字符串創建一些對象,但需要更好地瞭解它是如何工作的。

回答

3

這是因爲{a:"b"}語句,是表示下列內容:

  1. 通過{ ... }
  2. 界定的代碼block一個labela:
  3. 字符串文字"b"

後者是隻有表達式產生結果。

而且在AST探險家一樣的:https://astexplorer.net/#/gist/909bebf...

要回到你需要把它變成一個表達式首先,像一個對象:把它包在括號:eval('({a:"b"})')

但整體想法「我我正在考慮使用eval從字符串創建一些對象「聽起來很可疑。

+0

我猜JS規範將{}定義爲「代碼塊」,但這在常規JS代碼中很少見到 - 「代碼塊」的外觀是什麼?通常一個代碼塊只在一個函數的上下文中。 –

+1

@AlexanderMills你總是看到塊'if(true){...}' - 這是一個代碼塊。很多東西都接受單一語句作爲「操作數」,這就是塊作爲多個語句的「容器」的地方。 – zerkms

+0

@AlexanderMills:這不是非常罕見的代碼塊,你可以在if,for,while等代碼塊中使用代碼塊。它是非常少見且幾乎從不使用的標籤 – slebetman

相關問題