Поведение функции в javascript [дубликат]

Я создал библиотеку под названием HTML5DOMDocument, которая свободно доступна в https://github.com/ivopetkov/html5-dom-document-php

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

$dom = new IvoPetkov\HTML5DOMDocument();
$dom->loadHTML('

Hello

This is some text
'); echo $dom->querySelector('h1')->innerHTML;

355
задан thatpaintingelephant 3 January 2016 в 23:07
поделиться

16 ответов

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

Например:

(function(){ 
    var foo = 3; 
    alert(foo); 
})(); 

alert(foo); 

Это сначала предупредит «3», а затем выбросит ошибка в следующем предупреждении, поскольку foo не определен.

344
ответ дан Steve Bennett 26 August 2018 в 10:52
поделиться

IIRC позволяет создавать частные свойства и методы.

-2
ответ дан Ólafur Waage 26 August 2018 в 10:52
поделиться

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

Конечно, на половине реализаций JS там все равно.

6
ответ дан chaos 26 August 2018 в 10:52
поделиться

Пространство имен. Области JavaScript - это функциональный уровень.

19
ответ дан Christoph 26 August 2018 в 10:52
поделиться

Не могу поверить, что ни один из ответов не упоминает подразумеваемые глобальные переменные.

Конструкция (function(){})() не защищает от подразумеваемых глобальных переменных, что для меня больше беспокоит, см. http: / /yuiblog.com/blog/2006/06/01/global-domination/

В основном функциональный блок гарантирует, что все зависимые «глобальные вары», которые вы определили, ограничены вашей программой, это не защищает вас от определения неявных глобальных переменных. JSHint или тому подобное может дать рекомендации о том, как защитить от этого поведения.

Более сжатый синтаксис var App = {} обеспечивает аналогичный уровень защиты и может быть завернут в функцию блокировать, когда на «общедоступных» страницах. (см. Ember.js или SproutCore для реальных библиотек, использующих эту конструкцию)

Что касается свойств private, они вид переоцененных, если вы не создаете общедоступную структуру или библиотеку, но если вам нужно их реализовать, Дуглас Крокфорд имеет несколько хороших идей.

12
ответ дан Cristian Cavalli 26 August 2018 в 10:52
поделиться

Функция самоисполнения используется для управления областью переменной.

Область действия переменной - это область вашей программы, в которой она определена.

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

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

var globalvar = "globalvar"; // this var can be accessed anywhere within the script

function scope() {
    alert(globalvar);
    localvar = "localvar" //can only be accessed within the function scope
}

scope(); 

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

1
ответ дан Ej. 26 August 2018 в 10:52
поделиться

Похоже, на этот вопрос ответили все готово, но я все равно отправлю свой ввод.

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

var myObject = {
    childObject: new function(){
        // bunch of code
    },
    objVar1: <value>,
    objVar2: <value>
}

Функция позволяет мне использовать дополнительный код для определения атрибутов и свойств childObjects для более чистого кода, например, для установки обычно используемых переменных или выполнения математических уравнений; Ой! или проверка ошибок. в отличие от ограничений на синтаксис инстанцирования вложенных объектов ...

object: {
    childObject: {
        childObject: {<value>, <value>, <value>}
    }, 
    objVar1: <value>,
    objVar2: <value>
}

В кодировании вообще есть много неясных способов сделать много одинаковых вещей, заставив вас задаться вопросом: «Зачем беспокоиться? " Но новые ситуации продолжают появляться там, где вы больше не можете полагаться только на основных / основных директоров.

0
ответ дан Garrett 26 August 2018 в 10:52
поделиться

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

3
ответ дан Guffa 26 August 2018 в 10:52
поделиться

Поскольку функции в Javascript являются первоклассным объектом, определяя его таким образом, он эффективно определяет «класс», очень похожий на C ++ или C #.

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

1
ответ дан James Curran 26 August 2018 в 10:52
поделиться

Self-invocation (также известный как автоматический вызов) - это когда функция выполняется сразу после ее определения. Это основной шаблон и служит основой для многих других шаблонов разработки JavaScript.

Я отличный поклонник :) из-за этого:

  • Он сохраняет минимальный код
  • Он обеспечивает разделение поведения из представления
  • . Он обеспечивает закрытие, которое предотвращает конфликты именования

. Необычно - (Почему вы должны сказать, что это хорошо?)

  • Речь идет об определении и выполнении функции все сразу.
  • Вы могли бы, чтобы эта функция самоисполнения возвращала значение и передавала функцию как параметр для другой функции.
  • Это хорошо для инкапсуляции.
  • Это также хорошо для области обзора.
  • Да, вы можете заключить все ваши .js-файлы в функции самоисполнения и может предотвратить глобальное загрязнение пространства имен. ;)

Подробнее здесь .

34
ответ дан John 26 August 2018 в 10:52
поделиться

Функция self invoked в javascript:

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

2
ответ дан Kishor Vitekar 26 August 2018 в 10:52
поделиться

Я прочитал все ответы, здесь что-то очень важное отсутствует, я ПОКУПАЮ. Есть две основные причины: почему мне нужны самозаверяющие анонимные функции или лучше сказано «Выражение с немедленной вызывной функцией (IIFE)»:

  1. Лучшее управление пространством имен (Избегание загрязнения пространства имен -> Модуль JS )
  2. Закрытие (имитация членов частного класса, как известно из ООП)

Первое объяснено очень хорошо. Для второго, пожалуйста, изучите следующий пример:

var MyClosureObject = (function (){
  var MyName = 'Michael Jackson RIP';
  return {
    getMyName: function () { return MyName;},
    setMyName: function (name) { MyName = name}
  }
}());

Внимание 1: Мы не назначаем функцию MyClosureObject, что еще раз является результатом вызова этой функции. Помните () в последней строке.

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

Пусть мы попробуем несколько экспериментов:

Я могу получить MyName с помощью getMyName, и он работает:

 console.log(MyClosureObject.getMyName()); 
 // Michael Jackson RIP

Следующий хитроумный подход не сработает:

console.log(MyClosureObject.MyName); 
// undefined

Но я могу установить другое имя и получить ожидаемый результат:

MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName()); 
// George Michael RIP

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

3
ответ дан Lonely 26 August 2018 в 10:52
поделиться

(function(){ var foo = { name: 'bob' }; console.log(foo.name); // bob })(); console.log(foo.name); // Reference error

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

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

Переменные и функции внутри выражения функции стали частными (т. е. они не будут доступны вне функции.

1
ответ дан Madhankumar 26 August 2018 в 10:52
поделиться

упрощенный. Очень нормальный взгляд, его почти утешительный:

var userName = "Sean";

console.log(name());

function name() {
  return userName;
}

Однако. Что, если я включу на мою страницу действительно удобную библиотеку javascript, которая переводит продвинутые символы в их представления на базовом уровне?

Подождите ... что?

Я имею в виду. Если кто-то набирает персонажа с каким-то акцентом на него (например, французский или испанский персонаж), но мне нужны только «английские» персонажи? A-z в моей программе? Ну ... испанские «n ~» и французские «e /» персонажи (я использовал для этого два символа, но вы, вероятно, можете сделать умственный прыжок в персонаже, который представляет акценты), эти символы могут быть переведены в базовые символы 'n' и 'e'.

Итак, кто-то хороший человек написал всеобъемлющий конвертер символов, который я могу включить в мой сайт ... Я включаю его.

Одна проблема: у нее есть функция в ней 'name', как и моя функция.

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

Итак, нам нужно каким-то образом охватить наш код.

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

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

Это может решить нашу проблему. Теперь все закрыто и доступно только из наших открывающих и закрывающих фигурных скобок.

У нас есть функция в функции ... которая выглядит странно, но полностью законна.

Только одна проблема. Наш код не работает. Наша переменная userName никогда не повторяется в консоли!

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

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

main();

Или перед!

main();

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

Второе беспокойство: каковы шансы, что имя «главное» еще не используется? ... так очень, очень тонко.

Нам нужно больше очков. И какой-то способ автоматически выполнить нашу функцию main ().

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

(() {}) ();

Синтаксис неудобен как грех. Однако он работает.

Когда вы завершаете определение функции в круглых скобках и включаете список параметров (другой набор или круглые скобки!), он действует как вызов функции .

So снова посмотрим на наш код, с некоторым самоисполняющимся синтаксисом:

(function main() {
  var userName = "Sean";

    console.log(name());

    function name() {
      return userName;
    }
  }
)();

Итак, в большинстве обучаемых вы читаете, теперь вы будете бомбардировать термином «анонимное самоисполнение» или что-то подобное.

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

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

Очень сильно надолго, и я надеюсь, что это поможет!

67
ответ дан Sean Holden 26 August 2018 в 10:52
поделиться

Вот убедительный пример того, как полезная анонимная функция может быть полезна.

for( var i = 0; i < 10; i++ ) {
  setTimeout(function(){
    console.log(i)
  })
}

Выход: 10, 10, 10, 10, 10...

for( var i = 0; i < 10; i++ ) {
  (function(num){
    setTimeout(function(){
      console.log(num)
    })
  })(i)
}

Выход: 0, 1, 2, 3, 4...

5
ответ дан sg.cc 26 August 2018 в 10:52
поделиться

Есть ли параметр, а «Bunch of code» возвращает функцию?

var a = function(x) { return function() { document.write(x); } }(something);

Закрытие. Значение something используется функцией, назначенной a. something может иметь какое-то переменное значение (для цикла) и каждый раз, когда a имеет новую функцию.

7
ответ дан stesch 26 August 2018 в 10:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: