Анонимная функция Javascript против обычной функции

#javascript #jquery

#javascript #jquery

Вопрос:

В чем разница между:

 <script type="text/javascript">
        $().ready(function() {
            InitialDictionary = new Array();
            LoadCurrentValues(InitialDictionary);
            $("a[id*=SomeLink]").click(function() {
                if (!CompareDictionaries(InitialDictionary)) 
                {
                    alert('Hello')
                }
            }
        )
        })
</script> 
  

и

 <script type="text/javascript">
    $().ready(function () {
        InitialDictionary = new Array();
        LoadCurrentValues(InitialDictionary);
        $("a[id*=SomeLink]").click(CheckValuesChanged(InitialDictionary));
    })

    function CheckValuesChanged(InitialDictionary) {
        if (!CompareDictionaries(InitialDictionary)) 
        {
            alert('Hello')
        }
    } 
</script>
  

Не вдаваясь в подробности того, чего я пытаюсь достичь здесь, есть ли какая-либо причина, по которой анонимный метод работает нормально, а вызов функции — нет? Разве они не должны давать одинаковые результаты?

Ответ №1:

Чтобы вызвать функцию, вы должны сделать это:

 $("a[id*=LogoLink]").click(function(){CheckValuesChanged(InitialDictionary)});
  

Или:

 $("a[id*=LogoLink]").click("CheckValuesChanged(InitialDictionary)"); //might work
  

Комментарии:

1. Нет, это не сработает. При вызове setTimeout это сработало бы (за исключением переменной), но это вызывает сильное неодобрение.

2. @SLaks, следовательно, возможно , лучше выбрать вариант 1

3. И первое решение по-прежнему использует анонимную функцию. Операционная система, похоже, хочет сделать это без анонимной функции.

Ответ №2:

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

 $("a[id*=LogoLink]").click(CheckValuesChanged(InitialDictionary));
  

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

 $().ready(function () {
    InitialDictionary = new Array();
    LoadCurrentValues(InitialDictionary);
    $("a[id*=LogoLink]").click(CheckValuesChanged);

  function CheckValuesChanged() {
      if (!CompareDictionaries(InitialDictionary)) {
                alert('Hello')
      }
  } 
});
  

Комментарии:

1. InitialDictionary не входит в область CheckValuesChanged

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

3. Объявите InitialDictionary вне какой-либо функции, прямо в начале вашего тела javascript. Документ. Готовая функция присвоит ей значение, и CheckValuesChanged сможет получить к ней доступ позже.

4. Точка зрения @Dmitri Neal все равно останется в силе, потому что она будет опираться на глобальную переменную evil.

Ответ №3:

Второй пример неверен:

 $("a[id*=LogoLink]").click(CheckValuesChanged(InitialDictionary));
  

Это должно быть:

 $("a[id*=LogoLink]").click(CheckValuesChanged);
  

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

Комментарии:

1. Нет, если OP хочет параметр

2. Не могу ли я передать параметр в функцию? Потому что я хочу повторно использовать этот метод в нескольких вызовах .click (…).

3. @Dante, да, ты можешь, используя первый подход.