Почему я могу использовать функцию до ее определения в JavaScript?

Ответа на этот вопрос Leandro Batista: просто проблема с выражением регулярного выражения.

 "use strict";
 var dataFromDB = "testal";
 
  $('input[name="tbInput"]').on("change",function(){
	var charToTest = $(this).val();
	var howManyChars = charToTest.length;
	var nrMatches = 0;
	if(howManyChars !== 0){
		charToTest = charToTest.charAt(0);
		var regexp = new RegExp(charToTest,'gi');
		var arrMatches = dataFromDB.match(regexp);
		nrMatches = arrMatches ? arrMatches.length : 0;
	}
		$('#result').html(nrMatches.toString());

  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="main">
What do you wanna count <input type="text" name="tbInput" value=""><br />
Number of occurences = <span id="result">0</span>
</div>

151
задан Peter Mortensen 8 December 2017 в 18:14
поделиться

6 ответов

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

Это отличается от присвоения с function выражение, которое оценено в нормальном нисходящем порядке.

, Если Вы изменили пример для высказывания:

var internalFoo = function() { return true; };

это прекратило бы работать.

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

Это документируется в стандарт ECMAScript , разделите 10.1.3 . К сожалению, ECMA-262 не является очень читаемым документом даже по стандартам стандартов!

*: содержание функции, блока, модуля или сценария.

203
ответ дан Oreo 8 December 2017 в 18:14
поделиться

Браузер читает Ваш HTML с начала до конца и может выполнить его, поскольку он читается и анализируется в исполняемые блоки (объявления переменной, функциональные определения, и т.д.), Но в любой точке может только использовать то, что было определено в сценарии перед той точкой.

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

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

, Поскольку Вы знакомитесь с JavaScript, Вы станете глубоко знающий о Вашей потребности записать вещи в надлежащей последовательности.

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

13
ответ дан dkretz 8 December 2017 в 18:14
поделиться

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

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

3
ответ дан Toon Krijthe 8 December 2017 в 18:14
поделиться

По той же причине следующее будет всегда помещать foo в глобальное пространство имен:

if (test condition) {
    var foo;
}
-4
ответ дан Andrew Hedges 8 December 2017 в 18:14
поделиться

Я только использовал JavaScript немного. Я не уверен, поможет ли это, но это выглядит очень похожим на то, о чем Вы говорите и можете дать некоторое понимание:

http://www.dustindiaz.com/javascript-function-declaration-ambiguity/

2
ответ дан Peter Mortensen 8 December 2017 в 18:14
поделиться

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

Только позже, тогда код выполняется, JavaScript на самом деле пытается узнать, существует ли "internalFoo" и что это и можно ли это назвать, и т.д.

0
ответ дан Aaron Digulla 8 December 2017 в 18:14
поделиться
Другие вопросы по тегам:

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