Javascript 使用`function.caller`
问题分两部分:Javascript 使用`function.caller`,javascript,Javascript,问题分两部分: 如何从对象方法获取function.caller 如何使用该值实际调用函数 例如: foo = { bar: function() {console.log(bar.caller);} } >语法错误:函数语句需要名称 例2: [bar.caller]() 提前感谢要让来电者(如果存在)使用以下方法: var caller = arguments.callee.caller; 要使用它,您必须先检查它是否存在,如下所示: if(caller) caller()
function.caller
foo = {
bar: function() {console.log(bar.caller);}
}
>语法错误:函数语句需要名称
例2:
[bar.caller]()代码>
提前感谢要让来电者(如果存在)使用以下方法:
var caller = arguments.callee.caller;
要使用它,您必须先检查它是否存在,如下所示:
if(caller)
caller();
示例:
函数foo(param){
if(param==5)返回console.log(param);
var caller=arguments.callee.caller;
如果(呼叫者)
调用者(参数+1);
}
功能条(参数){
foo(param);
}
foo(3);//不会记录任何内容(无调用方和参数!=5)
酒吧(3);//将导致递归,直到param==5,然后记录它。
您发布的代码的问题是,bar
在匿名函数中没有任何意义。名称“bar”是指定给foo
的对象的属性名称。因此,这很好:
var foo = {
bar: function() {
console.log("Caller is: " + foo.bar.caller);
}
};
function x() {
foo.bar();
}
x();
函数不需要名称;那无关紧要。为了访问调用者
属性,您需要对函数的引用,该引用可以来自任何地方。因此,这也将有助于:
var foo = {
bar: function() {
console.log("Caller is: " + this.bar.caller);
}
};
function x() {
foo.bar();
}
x();
因为当该函数作为foo.bar()
调用时,this
的值将是“foo”对象。通常,this
将是调用该方法的对象的值,但有一些警告。如果调用是作为foo.bar()
完成的,则此
将是foo
对象。至于错误,它似乎来自其他地方。当您使用无效的函数声明语法时,会出现该错误;没有名字的人。您显示的唯一函数是表达式,而不是声明,因此不会产生错误。我不知道您试图实现什么,但是函数。调用方
(以及参数。调用方
和参数。被调用方
是且不打算在生产代码中使用。@allnodcom这是一个非标准功能,您应该在生产代码中避免这种情况<代码>此功能是非标准的,不在标准轨道上。不要在面向Web的生产站点上使用它:它不会适用于所有用户。实现之间也可能存在很大的不兼容,将来行为可能会改变。
但是参数
对象已被降级。@allnodcoms:参数
对象未被弃用。@allnodcoms参数
未被弃用。证明???@allnodcom此sais函数。调用方
已弃用,而非参数
已弃用。看一看!您不应该使用,它的[removed fromstrict mode
](为什么arguments.callee从ES5 strict mode中删除?)。而且不受支持!使用这只是一种不好的做法。当foo
被重新分配或this
被证明是一个意外值时,缺少函数名就变得非常重要了。@squint同意;事实上,我不会以这种方式编写代码,可能会执行类似于在闭包中创建“foo”对象之类的操作,或者确保从函数访问对象。(从更广泛的意义上说,我不确定我是否真的想要函数.caller
,尽管我认为在某些调试实例中它可能有用。)是的,很难说服我将.caller
用于任何其他用途是最好的方法,但谁知道我猜呢。也许是调试,但在调用堆栈上有一个可视的断点对我来说确实更好。@Pointy-nail它。。。只是需要增加特异性。谢谢你,伙计。而当你在点名时,你却在点名“打电话的人”;o) @allnodcomsfoo.bar.caller()
将调用调用方函数