2009-12-08 2 views
27

Являются ли приведенные ниже фрагменты кода JavaScript некоей декларацией функции? Если нет, кто-то, пожалуйста, дайте обзор того, что они собой представляют?Объявление функции JavaScript

some_func = function(value) { 
    // some code here 
} 

и

show:function(value){ 
    // some code here 
} 

ответ

25

Первый просто создает анонимную функцию и присваиваем его переменной some_func. Поэтому использование функции some_func() вызовет функцию.

Второй должен быть частью объекта нотации

var obj = { 
    show:function(value){ 
    // some code here 
    } 
}; 

Так, obj.show() будет вызывать функцию

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

+0

Внешняя скобка на 'obj' является излишней –

+1

Oh! Ответ на одно из моих сообщений в SO о написании кода с использованием шаблона модуля сказал, что без этих скобок иногда анонимные функции могут потерпеть неудачу. Я до сих пор не получил объяснений, почему. Не уверены, применяются ли они только к шаблонам модулей или ко всем анонимным функциям. Вот почему я добавил их. – 2009-12-08 10:49:38

+0

Я думаю, что это только когда вы меняете объект вроде 'eval (" ({a: 1}) ")' – YOU

2

Один из способов сделать это:

var some_func = function(value) { 
    // some code here 
} 

Другой способ:

function some_funct() { 
} 

Еще один способ:

var some_object={}; 
some_object["some_func"] = function() {}; 

или:

var some_object={}; 
some_object.some_func = function() {}; 

Другими словами, они много способов объявить функцию в JS.


Ваш второй пример неправильный.

+0

'some_object [" some_func "] = function() {};' является громоздким. Использование точечной нотации является более чистым: 'some_object.some_func = function() {};' –

+0

@Justin: ... и еще один способ объявить функцию! – jldupont

+0

Декларация о том же (RHS), это только обозначение доступа, которое отличается (LHS);) –

1

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

+0

Вторая форма иногда используется в объектных литералах: 'some_obj = { init: function() {}, show: function() {} };' – MBO

+0

обновил сообщение, ответ @ senthil также прав. – yoda

4

Первый локальный (или глобальной) переменной с назначенным анонимной функции.

var some_name = function(val) {}; 
some_name(42); 

Second - это свойство какого-либо объекта (или функции с меткой перед ним) с назначенной анонимной функцией.

var obj = { 
    show: function(val) {}, 
    // ... 
}; 
obj.show(42); 

Функции являются первоклассными гражданами в JavaScript, поэтому вы можете назначить их переменным и вызвать эти функции из переменной.

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

var obj = { 
    show: function(val) { 
     if (val > 0) { this.show(val-1); } 
     print(val); 
    } 
}; 

вы могли бы написать:

var obj = { 
    show: function f(val) { 
     if (val > 0) { f(val-1); } 
     print(val); 
    } 
}; 
1

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

Второй пример - объявление функции внутри объекта. она присваивает функции как значения show свойства объекта:

var myObj = { 
    propString: "abc", 
    propFunction: function() { alert('test'); } 
}; 

myObj.propFunction(); 
+0

Ваша нотация JSON неверна. –

+0

d'oh. спасибо, что заметили. если бы * то * было бы тем, что я хотел написать, я бы не обратился к фактическому вопросу: D –

0

первым ...

some_func = function(value) { 
    // some code here 
} 

объявляет переменную и присваивается anonymous function к нему, что эквивалентно ...

function some_func (value) { 
    // some code here 
} 

Второй должен выглядеть следующим образом ...

obj = { 
    show:function(value){ 
     // some code here 
    } 
} 
// obj.show(value) 

и эквивалентен ...

//pseudo code 
class MyClass { 
    function show (value) { 
     // some code here 
    } 
} 
obj = new MyClass(); // obj.show(value) 

Приветствия

+0

Ваши последние два примера не эквивалентны, поскольку вы не можете создавать экземпляры объектов (ошибка: «TypeError: obj не является конструктором»). 'var Obj = function() {this.show = function() {}; } 'эквивалентно вашему псевдокоду. –

+0

@ Justin Johnson - О! В самом деле? Тогда почему это работает отлично? 'obj = {show: function (value) {alert (" work ");}} obj.show();' –

+0

Да, действительно. Я не сказал, что 'obj.show()' не работает, я сказал, что ваши примеры не эквивалентны. –

72

Есть шесть способов/контексты, в которых для создания функции:

1) Стандартной декларативный обозначения (наиболее знакомой люди с фоном C)

function foo() {} 

Все остальные функции выражения:

2) в качестве метода объекта буквального

var obj = { 
    foo: function() {} 
}; 

3) в качестве метода создан экземпляр объекта (созданного каждый раз, когда new является exectued)

var Obj = function() { 
    this.foo = function() {}; 
}; 

4) в качестве способа прототипа (создается только один раз, независимо от того, сколько раз new выполняется)

var Obj = function() {}; 
Obj.prototype.foo = function() {}; 

5) В качестве анонимной функции со ссылкой (такой же эффект, как # 1) *

var foo = function() {}; 

6) В качестве немедленно выполняется анонимно функции (полностью анонимными)

(function() {})(); 

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

+0

Есть ли причина предпочитать # 1 или # 5? Я вижу # 5 во многих библиотеках, а иногда и в № 1. – EsTeGe

+6

Ничего, я нашел ответ сам здесь: http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/ – EsTeGe

+0

Это замечательно. +1. –

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