繁体   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