Почему arguments.callee.caller.name неопределенный?

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