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

时间:2017-10-03 10:20:45

标签: javascript jquery

我有以下情况:

  • 使用commons方法的主要脚本
  • 其他几个使用它们的脚本



(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>
&#13;
&#13;
&#13;

我想要做的是在我的mainMethod 记录我将从调用该方法的上下文。

我首先想到的是为每个调用添加一个参数:

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

但是因为这仅用于日志目的(不起作用),并且我有数千个这样的修改,我想避免这种情况。

所以我想也许有办法通过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检索它...是否可能?

2 个答案:

答案 0 :(得分:1)

我认为你最接近的是使用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>

答案 1 :(得分:1)

如果您不想将数千次调用更改为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();
})();