可以用javascript获取调用方上下文吗?

可以用javascript获取调用方上下文吗?,javascript,Javascript,我尝试了arguments.callee和arguments.callee.caller,但是运气不好…因为这个关键字引用了词典环境中的ThisBinding,javascript(或ECMAScript)不允许对词典环境进行编程访问(事实上,没有对整个执行上下文的编程访问),因此不可能获得调用者的上下文 另外,当您尝试test.demo()时在全局上下文中,应该根本没有调用方,也没有附加到调用方的上下文,这只是一个全局代码,而不是调用上下文。函数的this关键字的值是由调用设置的,它不是“上下

我尝试了
arguments.callee
arguments.callee.caller
,但是运气不好…

因为
这个
关键字引用了
词典环境中的
ThisBinding
,javascript(或ECMAScript)不允许对
词典环境进行编程访问
(事实上,没有对整个
执行上下文的编程访问
),因此不可能获得调用者的上下文


另外,当您尝试
test.demo()时
在全局上下文中,应该根本没有调用方,也没有附加到调用方的上下文,这只是一个全局代码,而不是调用上下文。

函数的
this
关键字的值是由调用设置的,它不是“上下文”.函数有一个执行上下文,其中包含其this值。它不是由
this
定义的


在任何情况下,由于所有函数都有一个
this
变量,该变量是其变量对象的属性,因此除非传递给函数,否则不能在作用域中引用任何其他
this
关键字。不能直接访问变量对象;取决于作用域链上的变量分辨率,因此
this
将方法是当前执行上下文的
this

通过上下文,我假定您的意思是
this
?这取决于函数的调用方式,而不是从调用它的位置

例如(使用Webkit控制台):


顺便说一句,它已经被弃用了。

你说的“调用方上下文”是什么意思?也许你指的是它的this关键字的值?@RobG,在我的例子中,它应该是
window
,实际上是调用站点的
this
关键字。你有什么理由不能通过它吗?
test.demo(这个)
?@cycahh将this值传递给函数时,可以将其设置为调用中的任何内容(这也是调用此“上下文”会产生误导的原因之一)。由于该值应该是调用方的this,因此它应该是
test.demo.call(this)
,但我怀疑OP不想破坏函数的默认设置,这将是
demo
@otakustay关于不能引用变量作为其他变量对象的属性的说法是完全正确的。但作为一种特殊情况,全局变量是全局对象的属性,因此实际上您可以访问变量如果是全局的,则在调用上下文中为iables。您可以测试(不推荐,非标准)
arguments.callee.caller
属性,如果它是
null
假设调用来自全局代码,那么希望您不是在ES5严格模式下,获取对全局对象的引用并从那里开始。这就是Node.JS和模块遇到问题的地方。
var test = {
    demo: function(){
      //get the caller context here
    }
}
//when this gets called, the caller context should be window.
test.demo();
var test = {
    demo: function() {
        console.log(this);
    }
}
test.demo();    // logs the "test" object
var test2 = test.demo;
test2();        // logs "DOMWindow"
test.demo.apply("Cheese"); // logs "String"