2013-04-11 5 views
1

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

var aFunc = function(){}; 

Я знаю, что это называется функцией.

function bFunc(){}; 
+0

'function() {}' - анонимная функция, а 'aFunc' - нет. –

ответ

3

Итак, прежде всего, мы должны прояснить основное различие между двумя написанными вами функциями.

Это одно:

var aFunc = function(){}; 

является функцией выражение а. Где это:

function bFunc(){}; 

является функция объявления а.

В выражении функции вы используете function operator для определения функции внутри выражения. Когда вы , объявляете функцию, вы используете function statement.

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

var aFunc = function(){}; 

Это анонимная функции. В некоторых браузерах вы можете распечатать function's name и посмотреть сами:

console.log(aFunc.name); 

(Обратите внимание, что это не стандарт еще, но есть proposal)

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

var aFunc = function myFunction() {}; 

Это именованная функция. Тем не менее, это все еще отличается от объявления такой функции:

function myFunction() {}; 
var aFunc = myFunction; 

Почему? Потому что в случае выражения функции, вы не объявляете myFunction функции в сфере:

var aFunc = function myFunction() {}; 

console.log(typeof myFunction) // undefined, unless some bugs 

Так что точка, чтобы дать имя выражения функции? Ответ: иметь доступ к этой функции из самого тела функции, не загрязняя область действия.Обработки изображений, например, вы хотите добавить прослушиватель событий в узел DOM, но выполнить слушателя только один раз:

document.body.addEventListener("click", function onclick() { 
    // do something 
    document.body.removeEventListener("click", onclick, false); 
}, false); 

Таким образом, вы не загрязняют сферу с большим количеством функций, которые используются только для целей, как, что и вы все равно можете получить доступ к функции из тела функции. Это особенно полезно в ES5, где arguments.callee устарел и для рекурсии.

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

function() { 
    console.log('foo'); 
}(); 

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

!function() { 
    console.log('foo'); 
}(); 

// or 
(function(){ 
    console.log('foo'); 
}()); 

// etc, there are a lot of ways 

Здесь мы: JS понять это выражение, поэтому угрозы в function как оператор, а не как заявление. И вы получаете IIFE (Expression Exposed Function Expression), которые полезны во многих сценариях, особенно там, где вы хотите изолировать код.

Итак, вернемся к вам вопрос, почему имя этой функции:

var aFunc = function(){}; 

не aFunc?

Потому что это выражение. Значит, значение ничего не знает о назначении слева. Это как:

var aFunc = -3; 

Если - является Unary Negation operation и 3 это значение: они ничего не знает о aFunc, верно? Точно так же с выражение функции, где function - оператор, а (){} - значение.

3

No.

В первом примере вы создаете анонимную функцию, а затем назначить его «aFunc»

Во втором примере вы объявляете функцию и вызвать ее bFunc.

Наиболее заметным отличием между ними является то, что вы не можете вызвать «aFunc» до тех пор, пока строка, в которую вы ее назначили.

2

Нет, это не так. Правая сторона вашего первого оператора - это Функция Expression. Это анонимно, если вы не назначаете его переменной.

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

Смотреть подробнее о функции деклараций in this question

3

Нет, эта функция не будет «взять имя переменной». Переменная будет содержать ссылку на анонимную функцию. Сама функция по-прежнему анонимна.

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

function foo() { } 
foo(); 
foo = 'bar'; 
alert(foo); // bar 
3

Термин «анонимные функции» жаргон, поэтому, скорее всего, что это означает, что со временем изменится. Нет спецификации, которая заявляет, что это такое, поэтому она может быть тем, кем вы хотите. И все, что вы решите, скорее всего, будет оспорено кем-то другим. Жаргон подобен этому (посмотрите слово «транкинг», общий термин жаргона в телефонии).

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

function foo() { 
    ... 
} 

и выражения функций, в которых имя является необязательным. Если имя отсутствует, например:

var x = function() { 
      ... 
     }; 

то это для меня анонимная функция. Если у него есть имя, например.

var x = function foo() { 
      ... 
     }; 

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

// assignment to a variable 
var x = function() {...} 

// pass as a parameter 
foo(function(){...}) 

// immediately executed and pass the result 
foo((function(){...}())) 

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

Другие могут отличаться, конечно.

Между прочим, результаты:

function foo(){} 

и

var foo = function(){}; 

практически неотличимы, основное отличие состоит при создании функции.

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