2016-02-11 2 views
1

У меня есть форму, и я добавляю addEventListener() к форме. Я хотел вызвать функцию из addEventListener(), но я получаю Uncaught TypeError при вызове функции.Вызов функции из addEventListener

Код 1

$(document).ready(function(){ 
    function uploadFile(){ 
     alert("comes here"); 
    } 

    uploadForm.addEventListener('submit', function(e) { 
     var uploadFile = document.getElementById('upload-file').files; 
     e.preventDefault(); 
     uploadFile(); 
    }); 
}); 

Но если изменить код выше для

кодекса 2

$(document).ready(function(){ 
    var test = function uploadFile(){ 
     alert("comes here"); 
    } 

    uploadForm.addEventListener('submit', function(e) { 
     var uploadFile = document.getElementById('upload-file').files; 
     e.preventDefault(); 
     test(); 
    }); 
}); 

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

Я сам программист, поэтому я не знаю, что делать с Google, чтобы понять, почему это происходит. Ближайший я получил this, function naming

В качестве ответа я просто ищу некоторые термины, которые я могу понять, почему это происходит.

+0

Это звучит странно, вы должны иметь возможность вызывать 'uploadFile' из первого фрагмента и' test() 'из второго фрагмента. Но для тех, кто хочет увидеть его в действии, https://jsfiddle.net/mendesjuan/e9sa1jLc/ –

+0

как работает код 2? – nAviD

+0

@JuanMendes Приносим извинения за создание jsfiddle.Это была глупая ошибка с моей стороны. –

ответ

3

Вы переопределяется имя функции uploadFile с переменной с именем uploadFile, это просто название столкновение

$(document).ready(function(){ 
    function uploadFile(){ //uploadFile function declaration 
     alert("comes here"); 
    } 

    uploadForm.addEventListener('submit', function(e) { 
     //function uploadFile already declared, and now you are using var here 
     var uploadFile = document.getElementById('upload-file').files; 
     e.preventDefault(); 
     uploadFile(); 
    }); 
}); 

Простое изменение названия поможет

$(document).ready(function(){ 
    function uploadFile2(){ //NOTICE NAME 
     alert("comes here"); 
    } 

    uploadForm.addEventListener('submit', function(e) { 
     var uploadFile = document.getElementById('upload-file').files; 
     e.preventDefault(); 
     uploadFile2(); //NOTICE NAME 
    }); 
}); 

Во втором примере, все в порядке , так как у вас есть имя функции test, которое не сталкивается с uploadFile переменная

Также Кассовое @JuanMendes ответить, как он объясняет причину проблемы и очень полезно для базы знаний

+0

Я. Как тупой я. Спасибо, Медет. Я просто потратил 1 час на это. –

+0

Есть еще что-то, что можно объяснить, почему не первый пример, который также имеет именованную функцию 'uploadFile' переопределяет переменную? [Бесстыдный плагин для моего ответа] (http://stackoverflow.com/a/35340439/227299) –

+0

@JuanMendes, потому что он был объявлен с помощью var, это вызовет конфликт имен, когда у него нет var, он будет отменен, вы не может объявить 'var a = 1; var a = 2; 'компилятор выкинет исключение –

2

Метет является правильным, var uploadFile переопределяет function uploadFile() от внешнего. Тем не менее, я хотел бы добавить дополнительные пояснения относительно того, почему var test = function uploadFile() не сталкивается с местными var uploadFile

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function#Named_function_expression

Если вы хотите обратиться к текущей функции внутри тела функции, необходимо создать выражение с именем функции. Это имя затем локально только для тела функции (scope). Это также позволяет избежать использования нестандартного свойства arguments.callee.

+0

Это никогда не происходило со мной. Благодарю. Множество учиться в javascript –

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