簡體   English   中英

Javascript 在對象文字上調用 eval(帶函數)

[英]Javascript calling eval on an object literal (with functions)

免責聲明:我完全理解使用 eval 的風險/缺點,但這是一個我找不到任何其他方法的利基案例。

在 Google Apps Scripting 中,仍然沒有將腳本作為庫導入的內置功能,因此許多工作表可以使用相同的代碼; 但是,內置的設施,我可以從一個純文本文件導入文本。

這是評估代碼:

var id = [The-docID-goes-here];
var code = DocsList.getFileById(id).getContentAsString();
var lib = eval(code);
Logger.log(lib.fetchDate());

這是我在外部文件中使用的一些示例代碼:

{
  fetchDate: function() {
    var d = new Date();
    var dateString = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();
    return dateString;
  }
}

我的目標是將一個大對象文字(包含所有庫代碼)放到一個局部變量上,這樣我就可以引用它的屬性/函數,就像它們包含在自己的命名空間中一樣。

替換var lib = eval(code); 和:

var lib = eval('(' + code + ')');

當省略括號時,花括號被解釋為代碼塊的標記。 因此, eval的返回值是fetchData函數,而不是包含該函數的對象。

當缺少函數名時,塊內的代碼被讀取為標記的匿名函數語句,這是無效的。

添加括號后,大括號用作對象字面量(如預期), eval的返回值是一個對象,使用fetchData方法。 然后,您的代碼將起作用。

你無法評價

{
  fetchDate: function() {
    var d = new Date();
    var dateString = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();
    return dateString;
  }
}

因為它不是一個有效的表達式(對象文字本身被解釋為塊。fetch: function () { } 不是一個有效的表達式)。

嘗試

var myLibName = {
  fetchDate: function() {
    var d = new Date();
    var dateString = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();
    return dateString;
  }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM