簡體   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