Я знаю, что это действительно поздно, но выставлять его в любом случае на всякий случай, если это помогает другим. Вот функция, с которой я столкнулся, которая, похоже, хорошо разбирается в различиях между месяцами между двумя датами. Это, по общему признанию, намного бесполезнее, чем у мистера Коудера, но дает более точные результаты, пройдя через объект даты. Это в AS3, но вы должны просто убрать сильную типизацию, и у вас будет JS. Не стесняйтесь, чтобы он выглядел лучше всех!
function countMonths ( startDate:Date, endDate:Date ):int
{
var stepDate:Date = new Date;
stepDate.time = startDate.time;
var monthCount:int;
while( stepDate.time <= endDate.time ) {
stepDate.month += 1;
monthCount += 1;
}
if ( stepDate != endDate ) {
monthCount -= 1;
}
return monthCount;
}
Это короткое выражение Immediately Invoked Function / или IIFE . Он выполняется сразу после его создания.
Он не имеет никакого отношения к любому обработчику событий для любых событий (например, document.onload
). Рассмотрим часть в первой паре круглых скобок: (function(){})();
.... это регулярное объявление функции. Затем посмотрите на последнюю пару (function(){})();
, это обычно добавляется к выражению для вызова функции; в этом случае наше предыдущее выражение.
Этот шаблон часто используется при попытке избежать загрязнения глобального пространства имен, поскольку все переменные, используемые внутри IIFE (как и в любом другом нормальном функция) не видны за пределами ее объема. Вот почему, может быть, вы путаете эту конструкцию с обработчиком событий для window.onload
, потому что это часто используется как это:
(function(){
// all your code here
var foo = function() {};
window.onload = foo;
// ...
})();
// foo is unreachable here (it’s undefined)
Исправление, предложенное Guffa :
Функция выполняется сразу после ее создания, а не после ее анализа. Весь блок сценария анализируется до того, как будет выполнен любой его код. Кроме того, код разбора автоматически не означает, что он выполнен, если, например, IIFE находится внутри функции, то он не будет выполняться до тех пор, пока не будет вызвана функция.
Вызываемое выражение функции (IIFE) сразу же является функцией, которая выполняется, как только она создается. Он не связан ни с какими событиями, ни с асинхронным исполнением. Вы можете определить IIFE, как показано ниже:
blockquote>(function() { // all your code here // ... })();
Первая пара функций круглых скобок () {...} преобразует код в круглые скобки в выражение. вторая пара круглых скобок вызывает функцию, полученную из выражения.
blockquote>А
IIFE
также может быть описана как самозапускающая анонимная функция. Его наиболее распространенное использование заключается в ограничении объема переменной, созданной с помощью var или инкапсуляции контекста, чтобы избежать конфликтов имен.
Нет, эта конструкция просто создает область для именования. Если вы разбили его по частям, вы увидите, что у вас есть внешний
(...)();
. Это вызов функции. Внутри круглой скобки у вас есть:
function() {}
Это анонимная функция. Все, что объявлено с помощью var внутри конструкции, будет видимо только внутри одной и той же конструкции и не будет загрязнять глобальное пространство имен.
IIFE (Немедленно вызывается выражение функции) - это функция, которая выполняется, как только скрипт загружается и уходит.
Рассмотрим приведенную ниже функцию в файле с именем iife.js
(function(){
console.log("Hello Stackoverflow!");
})();
. Этот код, указанный выше, будет выполнен, как только вы загрузите iife.js и напечатаете ' Hello Stackoverflow! "на консоли разработчика.
Подробное объяснение см. в Выражение с немедленной вызывной функцией (IIFE)
Это анонимная функция , которая является самоисключением . Обычно известный как Immediatly вызываемое выражение функции (IIFE).
Это просто анонимная функция, которая выполняется сразу после ее создания.
Это как если бы вы назначили ее переменной и использовали ее сразу после, только без переменной:
var f = function () {
};
f();
В jQuery есть аналогичная конструкция, о которой вы могли бы подумать:
$(function(){
});
Это краткая форма привязки события ready
:
$(document).ready(function(){
});
Это выражение вызывается с немедленным вызовом в Javascript:
Чтобы понять IIFE в JS, давайте сломаем его:
< / blockquote>// Function Expression var greet = function(name){ return 'Namaste' + ' ' + name; } greet('Santosh');
Как работает выражение функции: - Когда JS-движок запускается в первый раз (Execution Context - Create Phase), эта функция (с правой стороны = выше) не запускается или не сохраняется в памяти. Переменной «greet» присваивается значение «undefined» двигателем JS. - Во время выполнения (Execution Context - Execute phase) объект funtion создается «на лету» (еще не выполнен), получает назначение переменной «greet» и может быть вызван с помощью «greet (« somename »)».
3. Сразу вызывается выражение Funtion:
Пример:
// IIFE var greeting = function(name) { return 'Namaste' + ' ' + name; }('Santosh') console.log(greeting) // Namaste Santosh.
Как работает IIFE: - Обратите внимание на «()» сразу после объявления функции. Каждый объект funtion имеет прикрепленное к нему свойство «CODE», которое может быть вызвано. И мы можем вызвать его (или вызвать) с помощью скобок (). - Таким образом, здесь, во время выполнения (Контекст выполнения - Выполнение фазы), объект функции создается и выполняется одновременно. Так что теперь вместо переменной funtion вместо переменной funtion есть возвращаемое значение (строка)
Типичная Usecase IIFE в JS:
В качестве примера используется обычная схема IIFE.
// IIFE // Spelling of Function was not correct , result into error (function (name) { var greeting = 'Namaste'; console.log(greeting + ' ' + name); })('Santosh');
- мы здесь делаем две вещи. a) Обертывание выражения функции внутри фигурных скобок (). Это означает, что синтаксический синтаксический анализатор все, что помещается внутри (), является выражением (выражение функции в этом случае) и является допустимым кодом. б) Мы вызываем эту функцию в то же время, используя () в конце ее.
Таким образом, эта функция создается и выполняется одновременно (IIFE).
Важная утилита для IIFE:
IIFE сохраняет наш код в безопасности. - IIFE, являясь функцией, имеет свой собственный контекст выполнения, то есть все переменные, созданные внутри него, являются локальными для этой функции и не разделяются с глобальным контекстом выполнения.
Предположим, что у меня есть еще один JS-файл (test1.js), используемый в моем приложении вместе с iife.js (см. ниже).
// test1.js var greeting = 'Hello'; // iife.js // Spelling of Function was not correct , result into error (function (name) { var greeting = 'Namaste'; console.log(greeting + ' ' + name); })('Santosh'); console.log(greeting) // No collision happens here. It prints 'Hello'.
Итак, IIFE помогает нам писать безопасный код, где мы не сталкиваемся с глобальными объектами непреднамеренно.
Я думаю, что два набора скобок делают это немного запутанным, но я видел другое использование в примере с Google, они использовали что-то похожее, я надеюсь, что это поможет вам лучше понять:
var app = window.app || (window.app = {});
console.log(app);
console.log(window.app);
, так что если windows.app
не определен, тогда window.app = {}
немедленно выполняется, поэтому window.app
назначается с помощью {}
во время оценки условия, поэтому результат app
и window.app
теперь становятся {}
, поэтому консоль выход:
Object {}
Object {}
Обычно мы не вызываем функцию сразу после ее записи в программе. В чрезвычайно простых терминах, когда вы вызываете функцию сразу после ее создания, она называется IIFE - причудливое имя.
Это говорит о том, что выполняйте немедленно.
, так что если я делаю:
var val = (function(){
var a = 0; // in the scope of this function
return function(x){
a += x;
return a;
};
})();
alert(val(10)); //10
alert(val(11)); //21
Fiddle: http://jsfiddle.net/maniator/LqvpQ/
var val = (function(){
return 13 + 5;
})();
alert(val); //18
Используется причина, вызывающая анонимные функции: они никогда не должны вызываться другим кодом, поскольку они «настраивают» код, который должен быть вызван (наряду с предоставлением возможностей для функций и переменных).
Другими словами, они похожи на программы, которые «делают классы» в начале программы. После того, как они создаются (автоматически), единственными доступными функциями являются те, которые возвращаются анонимной функцией. другие «скрытые» функции все еще существуют вместе с любым состоянием (переменные, заданные при создании области).
Очень круто.
var same_name = 1; var myVar = function() { var same_name = 2; console.log(same_name); }; myVar(); console.log(same_name);
Имеет тот же результат.
– domenicr
20 April 2016 в 15:55
Обычно код javascrypt имеет глобальную область действия приложения. Когда мы объявляем глобальную переменную в нем, есть шанс использовать ту же повторяющуюся переменную в какой-то другой области разработки для какой-либо другой цели. Из-за этого дублирования может произойти некоторая ошибка. Таким образом, мы можем избежать этих глобальных переменных, используя сразу вызывающее выражение функции, это выражение является самоисполняющимся выражением. Когда мы делаем наш код внутри этого выражения IIFE, глобальная переменная будет похожа на локальную область и локальную переменную.
Two мы можем создать IIFE
(function () {
"use strict";
var app = angular.module("myModule", []);
}());
ИЛИ
(function () {
"use strict";
var app = angular.module("myModule", []);
})();
В приведенном выше фрагменте кода « var app » теперь является локальной переменной.
Начать здесь:
var b = 'bee';
console.log(b); // global
Поместить его в функцию и больше не глобально - ваша основная цель.
function a() {
var b = 'bee';
console.log(b);
}
a();
console.log(b); // ReferenceError: b is not defined -- *as desired*
Вызовите функцию немедленно - oops:
function a() {
var b = 'bee';
console.log(b);
}(); // SyntaxError: Expected () to start arrow function, but got ';' instead of '=>'
Используйте круглые скобки, чтобы избежать синтаксической ошибки:
(function a() {
var b = 'bee';
console.log(b);
})(); // OK now
Вы можете оставить имя функции:
(function () { // no name required
var b = 'bee';
console.log(b);
})();
Это не должно быть более сложным, чем это.
Uncaught SyntaxError: Unexpected token )
, а не любое упоминание о функции стрелки. Не могли бы вы поделиться с ним скрипкой, которая бросает ошибку функции стрелки?
– Script47
22 August 2017 в 19:49
Это анонимная функция самозапускания.
Проверьте объяснение W3Schools функции самозапускания .
Выражения функции может быть сделано «самозапускающимся».
Самозависающее выражение вызывается автоматически (автоматически) без вызова.
Выражения функций будут выполняться автоматически, если за выражением следует ().
Вы не можете самостоятельно вызывать объявление функции.
(function named(){console.log("Hello");}());
& lt; - self-executing с именем i>
– bryc
17 August 2015 в 08:04
Объявляет анонимную функцию, затем называет ее:
(function (local_arg) {
// anonymous function
console.log(local_arg);
})(arg);
arguments
- special ; я думаю, что ответчик просто щелкнул там, где имена
– cat
1 March 2016 в 03:36
(function () {
})();
Это называется IIFE (Expression Exited Function Expression). Один из знаменитых шаблонов дизайна javascript, и это сердце и душа современного модульного модуля. Как видно из названия, он выполняется сразу после его создания. Этот шаблон создает изолированную или личную область выполнения.
JavaScript до ECMAScript 6 с использованием лексического охвата, IIFE используется для имитации охвата блока. (С блочным охватом ECMAScript 6 возможно с введением ключевого слова let и const.) Ссылка на вопрос с лексическим охватом
Имитация блочного охвата с помощью IIFE
Преимущество производительности использования IIFE заключается в возможности передавать общеупотребительные глобальные объекты, такие как окно, документ и т. д. В качестве аргумента можно уменьшить просмотр области. (Помните, что Javascript ищет свойство в локальной области и вверх цепочки до глобального масштаба). Таким образом, доступ к глобальным объектам в локальной области, сокращает время поиска, как показано ниже.
(function (globalObj) {
//Access the globalObj
})(window);
Функциональное выражение с немедленным вызовом (IIFE) немедленно вызывает функцию. Это просто означает, что функция выполняется сразу после завершения определения.
Три более распространенных формулировки:
// Crockford's preference - parens on the inside
(function() {
console.log('Welcome to the Internet. Please follow me.');
}());
//The OPs example, parentheses on the outside
(function() {
console.log('Welcome to the Internet. Please follow me.');
})();
//Using the exclamation mark operator
//https://stackoverflow.com/a/5654929/1175496
!function() {
console.log('Welcome to the Internet. Please follow me.');
}();
Если особых значений для возвращаемого значения нет, тогда мы можем написать:
!function(){}(); // => true
~function(){}(); // => -1
+function(){}(); // => NaN
-function(){}(); // => NaN
В качестве альтернативы это может быть:
~(function(){})();
void function(){}();
true && function(){ /* code */ }();
15.0, function(){ /* code */ }();
Вы даже можете написать:
new function(){ /* code */ }
31.new function(){ /* code */ }() //If no parameters, the last () is not required
Автономная анонимная функция.
Один короткий и фиктивный пример, где это полезно:
function prepareList(el){
var list = (function(){
var l = [];
for(var i = 0; i < 9; i++){
l.push(i);
}
return l;
})();
return function (el){
for(var i = 0, l = list.length; i < l; i++){
if(list[i] == el) return list[i];
}
return null;
};
}
var search = prepareList();
search(2);
search(3);
Поэтому, вместо создания списка каждый раз, вы создаете его только один раз (меньше накладных расходов).
((foo) => foo)('foo value')
. – Gajus 18 December 2014 в 14:20