2011-01-09 2 views
3

Мне часто нужна функция f, чтобы получить имя метода, который указывает на f. Например. Скажем, у нас есть getMethodName(obj, methodFunction) функция, которая использует foreach на obj найти свойство, которое является ссылкой methodFunction:Получить функцию «self» в строгом режиме JavaScript

obj = { 
    foo : function() { 
     var myName = getMethodName(obj, arguments.callee); // "foo" 
    } 
} 

Как это сделать в строгого режима где arguments.callee устарела?

ответ

4

Вы не можете этого сделать. И вы не должны это делать в первую очередь, это волшебство, ваша функция не должна зависеть от его вызывающего абонента и т. Д. Измените свой дизайн, чтобы он снова работал.

arguments.callee и .caller не были удалены из-за плохого стиля, но также и потому, что они побеждают оптимизацию. В частности, вы не можете встраивать что-то, если вы зависите от вызывающего или от функции, поскольку код мог бы просто помещать где-нибудь без функции вокруг него.

Read: http://whereswalden.com/2010/09/08/new-es5-strict-mode-support-now-with-poison-pills/

+0

Почему статья начинается с «tl; dr»? Я знаю, что это значит вообще, но не в этом контексте. –

+0

@Sime Ну, я думаю, автор просто шутит здесь о том, что его статья в основном одна гигантская стена текста –

+0

Ага, тогда шутка. Вероятно, это так. –

1

Это стоит отметить, так как я не могу сказать, если вы считали, что если вы просто указать имя функции в литерал объекта, вы можете обратиться к нему таким образом:

obj = { 
    foo : function METHODNAME() { 
     var myName = getMethodName(obj, METHODNAME); // "foo" 
    } 
} 

Но берегитесь: я думаю, что IE есть ошибка в рабочих версиях, где это будет определить функцию с именем METHODNAME в области видимости (а не делает его доступным для этой функции только). По спецификации, однако, это совершенно кошерно и прекрасно работает, если вы используете имя, не найденное нигде в самой функции, или код, переданный в eval, если функция может вызвать eval.

+0

Но предположим, что хочу сделать addEventListener («event», myfun.bind (this)); Теперь я не могу удалить этого слушателя, не сохранив его где-нибудь, не так ли? Поскольку myfun.bind() возвращает новую функцию. Это супер-хромой. –

+0

Звучит правильно. Хотя я считаю, что «супер-хромой» очень нравится зрителям - это как язык и API работают. И как еще? Принимая за задание, что мы не хотим раскрывать поведение GC (так что поведение с низкой ссылочной характеристикой отсутствует), вам нужно каким-то образом удалить прослушиватель, который вы ранее добавили, что неоднозначно относится к нескольким слушателям. Не удаление, указав ссылку, чтобы удалить естественный путь? Это, наверное, немного неудобно, но я не вижу лучшего способа. –

+0

Ну, он отлично поработал, когда я мог использовать arguments.callee. Аргумент заключается в том, что вы без него ничего не теряете - просто назовите функцию. Я говорю, что на самом деле вы что-то теряете, потому что вы не можете всегда назвать функцию. Поэтому теперь мне приходится выбирать между отключением строгого режима и возникновением досады (и потенциальных утечек) отслеживания всех этих прослушивателей событий вручную. –

Смежные вопросы