在一些應用中,咱們但願給用戶提供插入自定義邏輯的能力,好比 Microsoft 的 Office 中的 VBA
,好比一些遊戲中的 lua
腳本,FireFox 的「油猴腳本」,可以讓用戶發在可控的範圍和權限內發揮想象作一些好玩、有用的事情,擴展了能力,知足用戶的個性化需求。安全
大多數都是一些客戶端程序,在一些在線的系統和產品中也經常也有相似的需求,事實上,在線的應用中也有很多提供了自定義腳本的能力,好比 Google Docs 中的 Apps Script
,它可讓你使用 JavaScript
作一些很是有用的事情,好比運行代碼來響應文檔打開事件或單元格更改事件,爲公式製做自定義電子表格函數等等。閉包
與運行在「用戶電腦中」的客戶端應用不一樣,用戶的自定義腳本一般只能影響用戶自已,而對於在線的應用或服務來說,有一些狀況就變得更爲重要,好比「安全」,用戶的「自定義腳本」必須嚴格受到限制和隔離,即不能影響到宿主程序,也不能影響到其它用戶。函數
而 Safeify 就是一個針對 Nodejs 應用,用於安全執行用戶自定義的非信任腳本的模塊。lua
咱們先看看一般都能如何在 JavaScript 程序中動態執行一段代碼?好比大名頂頂的 eval
spa
eval('1+2')
上述代碼沒有問題順利執行了,eval
是全局對象的一個函數屬性,執行的代碼擁有着和應程中其它正常代碼同樣的的權限,它能訪問「執行上下文」中的局部變量,也能訪問全部「全局變量」,在這個場景下,它是一個很是危險的函數。code
再來看看 Functon
,經過 Function
構造器,咱們能夠動態的建立一個函數,而後執行它對象
const sum = new Function('m', 'n', 'return m + n'); console.log(sum(1, 2));
它也同樣的順利執行了,使用 Function 構造器生成的函數,並不會在建立它的上下文中建立閉包,通常在全局做用域中被建立。當運行函數的時候,只能訪問本身的本地變量和全局變量,不能訪問 Function 構造器被調用生成的上下文的做用域。如同一個站在地上、一個站在一張薄薄的紙上同樣,在這個場景下,幾乎沒有高下之分。遊戲