1

Общий метод создания частных методов (сортов) в JavaScript заключается в следующем:Javascript частные методы: выражение функции против объявления функции

Class = function (arg0, arg1) { 
    var private_member = 0; 
    var privateMethod = function() { 
     return private_member; 
    }; 
} 

Приведенный выше пример также может быть сделано с помощью функции декларации вместо функция:

Class = function (arg0, arg1) { 
    var private_member = 0; 
    function privateMethod() { 
     return private_member; 
    } 
} 

Каким образом эти два способа объявления частного метода отличаются? (Вне того, что одно является выражением, а другое - объявлением)

Например, выражение, очевидно, генерирует новую функцию каждый раз, когда вызываемый конструктор вызывает. Случается ли это также с объявлением функции, или оно только оценивается один раз, потому что объявления функций оцениваются во время разбора? (В отличие от выражений функций, которые оцениваются во время выполнения, вы получаете идею.)

EDIT: Я знаю, что javascript не действительно имеют частные методы. Я использую этот термин свободно.

EDIT: Не дубликат var functionName = function() {} vs function functionName() {}, если что-то дубликат function expression vs function declaration with regard to javascript 'classes'. Мой вопрос заключается не в различии между выражениями функций и объявлениями функций в целом, а их различиями в отношении «частных членов» в «классах» javascript.

ответ

0

выражение, очевидно, генерирует новую функцию каждый раз при вызове конструктора. Случается ли это также с объявлением функции [...]?

Новая функция будет генерироваться каждый раз, либо метод

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

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

Каким образом эти два метода [определения] отличаются друг от друга?

Это же, как и в других местах, вы можете ссылаться на объявление функции на линии до линии оно определено (если это в Вашей области)

foo.bar; // undefined 
function foo() {} 

против выражение функция не была водрузили , поэтому идентификторов foo является Referenceable, но вы не можете ссылаться на функцию вы назначили на него, пока после

foo.bar; // TypeError: Cannot read property 'bar' of undefined 
var foo = function() {}; 
// same as 
var foo; 
foo.bar; // TypeError: Cannot read property 'bar' of undefined 
foo = function() {}; 

Убедитесь, что вы понимаете, что JavaScript - это не то же самое, что классические языки программирования; слова общественного и частные используются классическими программистами, когда речь идет о JavaScript означает «внешне Referenceable» и «не внешне Referenceable» соответственно.
Точно так же есть на самом деле не такая вещь, как класса (даже в ES 6, это просто синтаксический сахар для того, что мы сделали уже в ES 5). Вместо этого у нас есть Конструкторы и цепи прототипов.

+0

Таким образом, нет никакой разницы, кроме обычной декларации функции против выражения различий, тогда? И я знаю, что у javascript нет реальных классов, я использую термин «частный метод» свободно. – Wingblade

+0

Да. Если нет необходимости быть _expression_, я обычно пишу их как _declarations_, потому что лично мне легче их читать. Я все же пишу выражения. –

0

Практически нет никакой разницы: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions#Function_constructor_vs._function_declaration_vs._function_expression

Что еще более важно, они не являются частными методами (которые не существуют в JavaScript). Созданные вами методы доступны только внутри конструктора, что чрезвычайно ограничивает их ценность.

0

главное отличие

объявление функции прибудет таль это заключите сферу позволяет сказать

var Klass = function() { 

    return { 
    publicMethod: privateMethod 
    }; 

    function privateMethod() { 

    } 
} 

вы можете ссылаться на privateMethod ниже возвращения, потому что privateMethod будет развеваться в функции Klass, но вы можете» t сделать это с помощью выражения функции

var Klass = function() { 

    return { 
    publicMethod: privateMethod // privateMethod will be undefined 
    }; 

    var privateMethod = function() { 

    } 
} 

Вы не можете указать имя метода с выражением функции, которое указано

var method = function() { 
    if(somecondition) { 
    method();       
    } 
} 

вы должны дать ему имя, всегда perfer названный метод

var method = function method() { 
    if(somecondition) { 
    method(); 
    } 
}