2013-10-09 3 views
2

мне интересно, в чем разница между этим:неанонимные против анонимных функций в JavaScript

var o = { 
    name: 'John', 
    getName: function getName() { 
     console.log(arguments.callee.name + ' was called'); 
    } 
} 

o.getName(); 

К «обычному» анонимному подходу:

var o = { 
    name: 'John', 
    getName: function() { 
     console.log('getName was called'); 
    } 
} 

o.getName(); 

Потому что, очевидно, первый один, кажется, имеют некоторые преимущества ... Любые падения?

+1

Возможный дубликат [var functionName = function() {} vs function functionName() {}] (http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname) – Tibos

+0

@ Тибос - я не думаю, что это дубликат этих вопросов, а речь идет о выражениях функций и объявлениях. Этот вопрос касается названных функциональных выражений. – RobG

ответ

2

Любые падения?

Да.

  • arguments.callee устарел. Вы должны просто обратиться к getName, чтобы получить объект функции.
  • .name является нестандартным свойством, не ожидайте, что он будет работать в каждом браузере.
  • named function expressions вызывает некоторые проблемы в quirksy двигателей

Я бы с

var o = { 
    name: 'John', 
    getName: function getName() { 
     console.log('getName was called'); 
    } 
}; 

Где у вас есть именованная функция (которая полезна для стеков отладки вызовов), и тем не менее log() работы.

+0

Помогает ли этот подход решить проблемы в quirksy engine? – Guy

+0

Нет, я не забочусь о них (проблема на самом деле не приводит к дисфункциональному коду). Если вы это сделаете, вы должны использовать объявление функции, а затем назначить это свойство. Взгляните на http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html – Bergi

1

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

Live Demo

var myFunctionVar = function test(){ 
    alert(arguments.callee.name); 
}; 

var myFunctionVar2 = function(){ 
    alert(arguments.callee.name); 
}; 

myFunctionVar(); 

myFunctionVar2(); 

Как RobG и Берги указали есть проблемы в использовании код выше, поэтому, пожалуйста, некоторые дополнительные исследования, прежде чем использовать.

+0

Были [ошибки в IE] (https://groups.google.com/forum/#!msg/comp. lang.javascript/qt_UPJW6wcg/6LwEsAOLUFsJ) реализация названных функциональных выражений, которые были основой для их использования в течение длительного времени. Возможно, они исправлены в более поздних версиях, но IE 8 по-прежнему имеет разумную долю пользователей. – RobG

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