#javascript #oop #class #closures
#javascript #ооп #класс #замыкания
Вопрос:
Когда имеет смысл использовать выражения функций вместо объявлений функций при реализации «частных методов»? В обоих случаях функции инкапсулированы, единственное практическое отличие, по-видимому, заключается в том, что я не смог бы вызвать myFunc1 в конструкторе. Я знаю, что я должен использовать свойство prototype в любом случае, но мне просто любопытно.
function myClass
{
myFunc1() //error
myFunc2() //success
var myFunc1 = function()
{
}
function myFunc2()
{
}
}
Комментарии:
1. между ними нет разницы, кроме той, о которой вы упомянули
Ответ №1:
Вы можете вызвать функцию, назначенную переменной, но вы должны назначить ее, прежде чем сможете ее вызвать:
function myClass() {
var myFunc1 = function() {
}
myFunc1() //success
myFunc2() //success
function myFunc2() {
}
}
Эти функции являются локальными для конструктора, поэтому это не то же самое, что использовать прототип. Чтобы создать общедоступную функцию, вам нужно назначить ее объекту:
function myClass() {
this.myPublicFunc1 = function() {
}
this.myPublicFunc2 = myFunc2;
function myFunc2() {
}
}
var o = new myClass();
o.myPublicFunc1() //success
o.myPublicFunc2() //success
Ответ №2:
Вы должны использовать выражение, если хотите немедленно вызвать функцию.
Этот вызывает его и присваивает возвращаемое значение переменной:
function myClass {
var myVar = function() {
return 'some value'; // <--- 2. assign the return value to the variable
}(); // <--- 1. invoke the function immediately
function myFunc2() {
}
}
Этот вызывает его, но присваивает саму функцию переменной:
function myClass {
var myFunc1;
(myFunc1 = function() { // <--- 1. assign the function to the variable
// Do something
})(); // <--- 2. invoke the function immediately
function myFunc2() {
}
}
Комментарии:
1. Я не думаю, что есть какая-либо практическая разница в двух приведенных выше примерах. Первое было бы понятнее с дополнительным набором круглых скобок вокруг выражения RHS, второе просто запутано.
2. @RobG: На самом деле, эти два примера совершенно разные. Первое присваивает возвращаемое значение, второе присваивает саму функцию.
3. … и да, я бы согласился, что набор круглых скобок добавил бы ясности первому, но они не обязательны. Я не нахожу второй вариант запутанным.