2016-01-27 4 views
2

Я работаю на некоторый код JavaScript, который определяет некоторые методы класса, определяя прототип объекта, как показано ниже:Javascript имени функции присваивается свойству

/** 
* @constructor 
*/ 
function MyClass() { 
    var someField = 'hello world'; 
} 

MyClass.prototype = { 
    getSomeField1: function getSomeField2() { 
     return someField; 
    } 
}; 

У меня есть два вопроса:

  1. Что такое getSomeField2, и будет ли он доступен для любого кода?

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

Во всех других случаях аналогичного кода либо имя свойства, либо имена функций совпадают, либо функция не указана.

+0

Разве это не другой вопрос немного отличается? Мой вопрос о названной функции как ключевое значение в объекте. –

+0

Связанный вопрос (чтобы закрыть этот) не говорил о случае, когда у вас есть именованная функция, назначенная для свойства, поэтому я снова открыл его –

+0

@RichyRich, если вы используете 'arguments.callee', тогда вы получите' getSomeField2' как имя. – Jai

ответ

1

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

Как правило, люди используют анонимную функцию при назначении ей свойства или переменной. Хром очень хорошо разбирался в том, что он должен использовать свойство или имя переменной в трассировке стека, но IE использовал для анонимного.

Кроме того, названные функции имеют свойство name

(function a(){}).name // a 
(function(){}).name // "" 
+0

не только, getSomeField2 должен быть доступен изнутри функции;) – Icepickle

+0

Спасибо. В моем примере, какое имя будет отображаться в браузере? getSomeField1 или getSomeField2? –

+0

Как насчет того, чтобы запустить его и попробовать? Я предполагаю, что это показывает реальное имя, имя свойства - это резервное копирование –

1

Именование функций полезно для отладки. Например, при печати трассировки стека будет отображаться имя getSomeField2, а не «Анонимная функция». Это также полезно для определения рекурсивных функций, так как нет другого ясного способа для функции, которая могла бы вызвать себя. До named function expressions были введены в JS, если функция, которую нужно было назвать сам, заключалась в использовании (довольно уродливого и «запрещенного» с ES5) подхода arguments.callee.

Таким образом, чтобы ответить на ваш вопрос, то getSomeField2 связывание доступна только внутри тела функции, которые вы можете проверить следующим образом:

(function myFunctionName() { 
    console.log(`Inside: ${myFunctionName}`); // prints the function body 
})(); 
console.log(`Outside: ${myFunctionName}`); // ReferenceError: myFunctionName is not defined 
+0

Когда была введена функция имени? Они всегда были там.Раньше были некоторые браузеры (Safari), у которых были проблемы с назначением названных функций свойствам/переменным на раннем этапе AFAIK. –

+0

Неплохо, текст должен был читать «именованные функциональные выражения». Я не знаю, когда они были введены, но первое упоминание о них было найдено в спецификации ES3 (возможно, я неверно истолковал его). До этого, 'arguments.callee' или объявления функций были способом вызова функций рекурсивно, чтобы привести один пример. – Guilherme

+0

Да, названные функциональные выражения были введены позже. Их основное преимущество заключается в том, что они не создают глобальную функцию, как именованная функция, и (как вы упомянули) вы можете ссылаться на функцию из тела функции вместо 'arguments.callee'. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function –

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