为什么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();
答
把一个值对象文本,因为你正在做的,不影响价值可言。
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
是空的。
你试图达到什么目的吗??????????? – Qchmqs
因为您没有名称为'sendRequest'的函数,所以只有匿名函数。 –
即使“callee”和“caller”有时也非常方便,自ES5严格以来,这些都被弃用了。所以我建议不要再使用它们了。 – jAndy