2017-01-12 78 views
0

它是沒關係做到以下幾點:從字符串中調用函數的正確方法是什麼?

// Response from an API as a string, that contains a function to call. 
const stringFunc = 'myFunc({"Status":200,"Message":"This is a message"})'; 

function myFunc(obj) { 
    console.log(obj); 
} 

function callBack(stringFn) { 
    return Function.prototype.call(stringFn); 
} 

callBack(stringFunc); 

控制檯日誌:

{"Status":200,"Message":"This is a message"} 

看來工作得很好,但想知道這是否是去這在所有的正確方法?有沒有更好的方法或無法預料的影響?

謝謝

+0

貌似[JSONP](http://stackoverflow.com/questions/2067472/what -is-jsonp-all-about) – Andreas

+0

你也可以使用eval調用函數:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval –

回答

1

使用eval方法。

<!DOCTYPE html> 
 
<html> 
 

 
<body> 
 
    <script> 
 
     const stringFunc = 'myFunc({"Status":200,"Message":"This is a message"})'; 
 

 
     function myFunc(obj) { 
 
      console.log(obj); 
 
     } 
 

 
     function callBack(stringFn) { 
 
      return Function.prototype.call(stringFn); 
 
     } 
 

 
     eval(stringFunc); 
 
    </script> 
 
</body> 
 

 
</html>

+0

爲什麼你還有c allback()函數呢?如果使用eval()不需要,對吧? –

+0

如果您打算僅調用myFunc,則不需要callBack – Nitheesh

+0

請注意,使用eval()或使用任何其他方式從字符串執行代碼是一個嚴重的安全問題。當字符串來自不可信源時,攻擊者可以在網頁上下文中執行任何操作。你不應該那樣做。 – NineBerry

1

至於eval替代可以使用Function構造:

const stringFunc = 'myFunc({"Status":200,"Message":"This is a message"})'; 

function myFunc(obj) { 
    console.log(obj); 
} 

const payloadFunc = new Function(stringFunc); 
payloadFunc() //logs the object 
相關問題