繁体   English   中英

javascript - 如何访问调用者函数上下文对象

[英]javascript - how to access the caller function context object

我有以下情况:

  • 具有公共方法的主脚本
  • 其他几个正在使用它们的脚本

 (function() { window.mainMethod = function(param) { //... //console.log("I'm calling this method from context "+myContext.name); [CAN'T DO] console.log(arguments.callee.caller.name); } })(); // Object A (function() { var myContext = {}; myContext.name = "context A"; myContext.fn = function fnA() { window.mainMethod("param A1"); // ... window.mainMethod("param A2"); // ... window.mainMethod("param A3"); // etc... }(); })(); // Object B (function() { var myContext = {}; myContext.name = "context B"; myContext.fn = function fnB() { window.mainMethod("param B1"); // ... window.mainMethod("param B2"); // ... window.mainMethod("param B3"); // etc... }(); })();
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

我想要做的是将我的 mainMethod登录到我.

我想出的第一件事是为每个调用添加一个参数:

window.mainMethod("some parameter 1", myContext);

但是,由于这仅用于日志目的(不是功能性的),并且我有成千上万的此类 occorrence 需要修改,因此我想避免这种情况。

所以我想也许有一种方法可以通过callee.caller属性访问myContext对象,但这就是我到目前为止callee.caller

window.mainMethod = function(parameter) {
    //console.log("I'm calling mainMethod from context " + myContext.name);
    console.log(arguments.callee.caller.name);
}

这将打印出函数名称 ( fnA ),但仍然无法访问存储函数的对象 ( myContext )。

有什么建议吗?


ps:我也对变通方法持开放态度,我不知道,将一些隐藏属性绑定到函数,然后使用arguments.callee.caller.myHiddenProperty检索它......这可能吗?

我认为您将获得的最接近的是使用call显式更改上下文

 (function(){ window.mainMethod = function(param){ //... //console.log("i'm calling this method from context "+myContext.name); [CAN'T DO] console.log(this.name, arguments.callee.caller.name, param); } })(); // Object A (function(){ var myContext = {}; myContext.name = "context A"; myContext.fn = function fnA(){ window.mainMethod.call(myContext,"param A1"); // ... window.mainMethod.call(myContext,"param A2"); // ... window.mainMethod.call(myContext,"param A3"); // etc... }(); })(); // Object B (function(){ var myContext = {}; myContext.name = "context B"; myContext.fn = function fnB(){ window.mainMethod.call(myContext,"param B1"); // ... window.mainMethod.call(myContext,"param B2"); // ... window.mainMethod.call(myContext,"param B3"); // etc... }(); })();
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

如果您不想更改对mainMethod的数千次调用,则需要更改调用它的函数 ( fn )。 解决方案是将fn保留为一个函数,而不是像您当前拥有的函数的结果,然后将上下文添加到它,您可以稍后从mainMethod函数内部调用它:

(function() {
    window.mainMethod = function() {
        // will print the context that has been added to the function object
        console.log(arguments.callee.caller.context);
    }
})();

// Object A
(function() {
    var myContext = { name: 'A' };
    myContext.fn = function fnA() {
        window.mainMethod();
    // notice that I removed the `()` to keep `fn` as a function inside `myContext`
    };
    // now add the context inside the function object
    myContext.fn.context = myContext;
    // then just call it
    myContext.fn();
})();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM