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