簡體   English   中英

Javascript:具有不同執行上下文的執行功能

[英]Javascript: Execute function with different execution context

有沒有辦法在執行時手動更改Javascript函數的執行上下文?

不是在談論更改this引用以指向另一個對象-我知道可以通過Function.prototype.call()/apply()來完成。

我正在談論更改函數可以訪問的變量,或者更具體地說,是要授予對定義函數范圍之外的變量的訪問權限。

例:

var func;
(function () {
    func = function () {
        alert(test); // no variable called "test" defined, it will
                     // result in a ReferenceError when func() is called
    }
})();


function callFunction (callee) {
    var test ='foobar';
    callee(); // callee does not have access to "test"
}

callFunction(func);

在此示例中,我希望函數func能夠在被調用時訪問在callFunciton定義的變量test 但是,由於范圍和執行上下文在Javascript中是如何工作的,因此它不是那樣工作的。

我正在為callFunction尋找一種在callee()調用的執行上下文中插入稱為test的變量的方法。


在這個最小的示例中,當然可以僅將test作為參數添加到func()。

但是,我的用例是一個具有插件基礎結構的框架,插件可以在其中指定回調及其所使用的參數-以及參數類型。 然后,框架負責將請求的數據轉換為請求的類型,並將其提供給回調。 這應該對插件完全透明。

偽代碼:

插入

function callback {
    alert(user.name);
    alert(number);
};
var callbackParams = [
    {name : 'user', type : User},
    {name : 'number', type : Number}
];
defineCallback('event', callback, callbackParams);

構架

var on = {
    event : [];
}

var User = function (name) {
    this.name = name;
}

function defineCallback (event, callback, params) {
    on[event].push({
        callback : callback;
        params   : params;
    });
}

function handleEvent(event) {
    on[event].forEach(function (handler) {
        for (param of handler.params) {
            // 1) gather data
            // 2) create Object of correct type as specified in 
            //    param.type
            // 3) insert variable called param.name into 
            //    execution context of handler.callback
        }
        handler.callback();
    });
}

到目前為止,我找到了解決此問題的三種解決方案,但我都不喜歡:

  • 在回調中定義參數,並且僅在callbackParams中定義其類型,並按其在函數聲明中的順序進行索引。 缺點:必須在兩個地方聲明參數。
  • 在回調中使用this.paramname而不是paramname ,在`handleEvent()中使用.call()/.apply() ()。 缺點:對插件不透明。
  • handleEvent()調用handler.callback()之前,將變量分配給全局范圍,然后再刪除它們。 缺點:非常難看的解決方法。

有想法嗎?

您可以使用with語句。 請注意,它在嚴格模式下是緩慢且禁止的。

 var func; (function () { func = function func() { with(func.variables) { console.log(test); } } })(); function callFunction (callee) { callee.variables = {test: "foobar"}; callee(); callee.variables = null; } callFunction(func); 

暫無
暫無

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

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