[英]Inject variables into function scope
我該如何調用將任意變量/函數注入其范圍的函數? 我想定義一個“更新”函數,可以自由調用一系列函數,但是必須定義它們並將它們綁定在另一個作用域中。
我試過了with
但沒有用。
另外,我知道有很多解決方案,例如傳遞對象的函數來調用或定義參數列表並綁定它們,但是由於“ update”必須由用戶定義,因此其簽名必須只是一個簡單的函數,沒有參數(就像下面的代碼一樣),但是它必須可以訪問帶有任意綁定的一長串函數。
基本上就是這樣:update()函數的簽名中不得包含任何參數,並且函數內部只能使用其名稱進行調用(沒有this.printSize(),obj.printSize()等等)。
function obj (size) { this.printSize = function () { console.log(size); } } const obj1 = new obj(1); const obj2 = new obj(2); function update () { printSize(); } with(obj1) { update(); } with(obj2) { update(); }
建議觀看者謹慎:
function evalWith(obj, func) { with(obj) return eval('(' + func + ')')(); } // Example: function obj(size) { this.printSize = function() { console.log(size); } } const obj1 = new obj(1); function update() { printSize(); } evalWith(obj1, update); // 1
javascript中的變量綁定是在函數創建而不是調用時設置的。
因此,唯一有效的選擇是為對象中所需的變量命名空間,並在以后進行填充。 或者,您可以將變量設置為全局名稱空間(例如)窗口。
不幸的是,無法獲取函數的內容並在以后重新評估它。
您最多可以做的就是使用調用或應用程序更改傳遞給函數的參數的值,如其他人所述。
你有沒有嘗試過
function obj (size) {
this.printSize = function () {
// presumably do something with "this"
console.log(size);
}.bind(this);
}
您需要在每個with調用之前創建obj的實例
function obj (size) { printSize = function () { console.log(size); } } function update () { printSize(); } const obj1 = new obj(1); with(obj1) { update(); } const obj2 = new obj(2); with(obj2) { update(); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.