[英]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.