Получить функцию "self" в строгом режиме JavaScript
Я часто нуждаюсь в функции f
чтобы получить имя метода, который указывает на f
, Например. Допустим, у нас есть getMethodName(obj, methodFunction)
функция, которая использует foreach
на obj
найти свойство, которое является ссылкой на methodFunction
:
obj = {
foo : function() {
var myName = getMethodName(obj, arguments.callee); // "foo"
}
}
Как мне сделать это в строгом режиме, где arguments.callee
устарела?
2 ответа
Вы не можете сделать это. И вы не должны делать это в первую очередь, это волшебство, ваша функция не должна зависеть от вызывающей стороны и т. Д. Измените свой дизайн, чтобы он снова заработал.
arguments.callee
а также .caller
были удалены не только из-за плохого стиля, но и потому, что они проиграли оптимизацию. А именно, встраивая, вы не можете встроить что-то, если зависите от вызывающей стороны или от функции, так как код мог просто поместить куда-то без функции вокруг него.
Читайте: http://whereswalden.com/2010/09/08/new-es5-strict-mode-support-now-with-poison-pills/
Стоит отметить, так как я не могу сказать, рассматривали ли вы это, что если вы просто предоставляете имя функции в литерале объекта, вы можете ссылаться на него следующим образом:
obj = {
foo : function METHODNAME() {
var myName = getMethodName(obj, METHODNAME); // "foo"
}
}
Но будьте осторожны: я думаю, что IE имеет ошибку в версии выпуска, где это будет определять функцию с именем METHODNAME
во вложенном объеме (вместо того, чтобы делать его доступным только для этой функции). Тем не менее, по спецификации это совершенно кошерное и прекрасно работает, если вы используете имя, не найденное нигде в самой функции, или в коде, переданном в eval
если функция может вызвать eval
,