我有以下情况:
(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;
我想要做的是在我的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
检索它...是否可能?
答案 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();
})();