2011-11-03 136 views
0

這是怎麼沒有提示「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

回答

2

把一個值對象文本,因爲你正在做的,不影響價值可言。

var foo = { 
    sendRequest: ... 

函數值只受函數表達式影響,函數表達式不包含名稱。

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

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

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

請注意,您*可能會遇到以這種方式使用命名函數表達式的問題:http://kangax.github.com/nfe/#jscript-bugs –

0

因爲調用被調用函數的函數是一個匿名函數(因此沒有名字)。

嘗試:

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(); 
2

如果你這樣做:

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

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

foo.sendRequest(); 

你會發現函數沒有名字哪個是真:

function() { 

這是匿名功能。

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

2

,因此可以通過foo.sendRequest()被調用,該函數本身實際上並沒有一個名字。這就是爲什麼arguments.callee.caller.name是空的。