[英]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();
});
}
到目前為止,我找到了解決此問題的三種解決方案,但我都不喜歡:
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.