为什么arguments.callee.caller.name未定义?

问题描述:

这是怎么没有提示“http://127.0.0.1/sendRequest”? (可在http://jsfiddle.net/Gq8Wd/52/为什么arguments.callee.caller.name未定义?

var foo = { 
    sendRequest: function() { 
     alert(bar.getUrl()); 
    } 
};      

var bar = { 
    getUrl: function() { 
     return 'http://127.0.0.1/' + arguments.callee.caller.name; 
    } 
}; 

foo.sendRequest(); 
+0

你试图达到什么目的吗??????????? – Qchmqs

+1

因为您没有名称为'sendRequest'的函数,所以只有匿名函数。 –

+3

即使“callee”和“caller”有时也非常方便,自ES5严格以来,这些都被弃用了。所以我建议不要再使用它们了。 – jAndy

把一个值对象文本,因为你正在做的,不影响价值可言。

var foo = { 
    sendRequest: ... 

函数值只受函数表达式影响,函数表达式不包含名称。

   ... function() { 
     alert(bar.getUrl()); 
    } 

你需要包括你的函数表达式本身[fiddle]想要的名字。

var foo = { 
    sendRequest: function sendRequest() { 
+2

请注意,您*可能会遇到以这种方式使用命名函数表达式的问题:http://kangax.github.com/nfe/#jscript-bugs –

因为调用被调用函数的函数是一个匿名函数(因此没有名字)。

尝试:

function sendRequest() { 
    alert(bar.getUrl()); 
} 

var foo = { 
    sendRequest: sendRequest 
};      

var bar = { 
    getUrl: function() { 
     return 'http://127.0.0.1/' + arguments.callee.caller.name; 
    } 
}; 

foo.sendRequest(); 

如果你这样做:

var foo = { 
    sendRequest: function() { 
     alert(bar.getUrl()); 
    } 
};      

var bar = { 
    getUrl: function() { 
     return arguments.callee; 
    } 
}; 

foo.sendRequest(); 

你会发现函数没有名字哪个是真:

function() { 

这是匿名功能。

可以任意命名方法:虽然功能对象属性foo.sendRequest下保存sendRequest: function myMethodName() {

,因此可以通过foo.sendRequest()被调用,该函数本身实际上并没有一个名字。这就是为什么arguments.callee.caller.name是空的。