2013-08-13 4 views
0

Я часто вижу код как следующее в JavaScript:разница между funct1: функция по сравнению с функцией funct1()

func1: function() { 
     return array1.pop(); 
    } 

В чем разница между выше и что-то вроде этого:

function func1(){ 
     return array1.pop(); 
} 

ли два вышеупомянутых одинаково с другим способом письма? Первый выглядит как оператор переключения. Извините, если этот вопрос слишком прост, но в книгах JavaScript редко используется первый синтаксис, если это только вопрос синтаксиса; основная причина для меня задать этот вопрос в StackOverflow.

+4

Нижняя часть даст вам синтаксическую ошибку ... – Musa

+2

Первый будет * также * быть ошибкой, если он находится вне объектного литерала, вы имели в виду '=' вместо ':' там? Или вы уходите от окружающего контекста, что имеет значение? –

+0

Извините за ошибку кода, я ее исправил. –

ответ

2

Первый создает свойство на объектном литерале. Имя свойства - func1, а значение свойства - анонимная функция. Например:

var someObject = { 
    someProp: function() { 
     alert('foo'); 
    } 
}; 

someObject.someProp(); // alerts "foo" 

Для второго вы, вероятно, означало function func1 ..., который является обычная старая функция объявления. Например:

function someFunction() { 
    alert('foo'); 
} 

someFunction(); // alerts "foo" 

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

+0

Основываясь на вашем ответе, в первом случае вашего ответа я могу написать что-то вроде этого, чтобы представить то же самое правильно ... someObject.someProp = function() {alert ('foo');}, что должно означать одно и то же вещь. Правильно ли я слежу за этим? –

+0

@Jack_of_All_Trades yes, который добавит свойство к объекту, и вы будете называть его таким же образом. – jbabey

1

Вторая форма - это объявление «нормальной» функции: эта функция доступна в области, в которой вы ее объявили. Первая форма используется внутри объекта буквального:

var myObject = { 
    func: function() { 
     return array1.pop(); 
    }, 
    name: 'John Smith' 
}; 

функция может быть вызвана, как myObject.func() всякий раз, когда myObject доступен. Помимо этой разницы в определении области обзора, два определения функции эквивалентны.

1

Существует также очень важное различие, называемое «функцией подъема» (неопределенное с точки зрения ECMA, но является общим термином для описания поведения). Это напрямую связано со «вторым способом» в оригинальном вопросе а именно -

function func1(){ 
     return array1.pop(); 
} 

Есть два способа, мы можем использовать функции (опять WRT ко второму пути):

  1. в функции выражения -

    вар а = фу nction() {

    }

  2. В объявлении функции

    функция а() {

    }

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

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