#javascript #arguments
#javascript #аргументы
Вопрос:
Почему это не предупреждает «http://127.0.0.1/sendRequest «? (Доступно по адресу http://jsfiddle.net/Gq8Wd/52 /)
var foo = {
sendRequest: function() {
alert(bar.getUrl());
}
};
var bar = {
getUrl: function() {
return 'http://127.0.0.1/' arguments.callee.caller.name;
}
};
foo.sendRequest();
Комментарии:
1. чего вы пытаетесь достичь???????????
2. Потому что у вас нет функции с именем
sendRequest
, только анонимные функции.3. Даже если
callee
иcaller
иногда пригодятся, они устарели, поскольку ES5-strict . Поэтому я бы рекомендовал больше не использовать их.
Ответ №1:
Ввод значения в литерал объекта, как вы это делаете, вообще не влияет на значение.
var foo = {
sendRequest: ...
На значение функции влияет только выражение функции, которое не содержит имени.
... function() {
alert(bar.getUrl());
}
Вам нужно включить нужное имя в само выражение функции [fiddle].
var foo = {
sendRequest: function sendRequest() {
Комментарии:
1. Просто имейте в виду, что вы можете столкнуться с проблемами, используя выражения именованных функций таким образом: kangax.github.com/nfe/#jscript-bugs
Ответ №2:
Если вы сделаете это:
var foo = {
sendRequest: function() {
alert(bar.getUrl());
}
};
var bar = {
getUrl: function() {
return arguments.callee;
}
};
foo.sendRequest();
Вы заметите, что у функции нет имени, которое является true:
function() {
Это анонимная функция.
Вы можете назвать свой метод : sendRequest: function myMethodName() {
Ответ №3:
Хотя функция хранится в свойстве object foo.sendRequest
и, следовательно, может быть вызвана через foo.sendRequest()
, сама эта функция фактически не имеет имени. Вот почему arguments.callee.caller.name
пусто.
Ответ №4:
Потому что функция, вызывающая вызываемую функцию, является анонимной функцией (и, следовательно, не имеет имени).
Попробуйте:
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();