可以用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"