2014-01-22 18 views
2

在JAVA我生成這樣的字符串:即在所描述的如何在javaScript中像函數一樣執行String?

{ 
"name":"ali", 
"lastName":"cate", 
"action":"function(event) {alert(this.name +'clicked');}" 
} 

和我可以使用該字符串很容易在JavaScript等JSON對象,但是我不能執行該功能(在JS)行動屬性,我有這個錯誤:

TypeError: Object function(event) {alert(this.name +'clicked');} 
has no method 'apply' 

所以......有什麼辦法可以使它工作?

EDIT(詳細信息)

的問題是,JSON字符串是用Java生成(帶引號)。這是一個例子,實際上問題在於一個高圖餅圖,它在一個事件屬性中接收函數,並試圖運行該函數。

+3

相信的eval()會做到這一點,但它通常被認爲是不好的做法,使用。 – snollygolly

+1

它是有效的JSON,但不會將函數解析爲字符串,而不是函數? – adeneo

+0

它應該,這就是爲什麼我對這個「Object function ...」消息感到困惑。 – raina77ow

回答

4

您可以通過周圍的功能下降的行情做沒有eval ...

var obj = { 
"name":"ali", 
"lastName":"cate", 
"action": function(event) {alert(this.name +'clicked');} 
}; 

obj.action(''); 

記住,this不會是對象,如果你從一個真實的事件做到這一點 - 這將是元素點擊,例如。

從設計的角度來看,函數是否需要成爲對象的一部分?

function objectClicked(obj) { 
    alert(obj.name + ' clicked'); 
} 

你可以拉出來的功能,並有在自己的JavaScript,然後通過一個簡單的目標:

{ 
"name":"ali", 
"lastName":"cate" 
}; 

如果你真的detemined有關使用eval ...包裹功能的自動執行匿名功能,然後將這個評估結果分配給動作,這將導致動作僅僅是從此以後的正常功能...

var obj = { 
    "name":"ali", 
    "lastName":"cate", 
    "action":"(function() { return function(event) {alert(this.name + ' clicked');} }())" 
}; 

obj.action = eval(obj.action); 

obj.action(); 
+1

還要記住這是危險的,並且可以讓人們將JavaScript注入到頁面中。 – Liam

+0

Opener表示他在Java中生成了JSON字符串,並且希望在客戶端執行JavaScript函數。在函數週圍刪除引號會使該字符串成爲從服務器傳輸到客戶端的無效JSON。看到[這個問題在SO](http:// stackoverflow。com/questions/2001449/is-it-valid-to-define-functions-in-json-results) – baxeico

+0

+1 ...但只有使用第二種方法。在JSON中的功能不是一個好主意,**對我來說**。將函數放在ajax或JSON解析函數回調中。 - 我引用@Quentin(請參閱上面的註釋) – Frogmouth

2

發生此錯誤,因爲action是一個字符串而不是函數。

你可以讓它與eval一起工作,但這是不好的做法。

1

「的eval」將做到這一點:

var obj = { "action": "alert('test');" }; 
eval(obj.action); 
相關問題