Ответа на этот вопрос 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>
function
объявление является волшебным и заставляет свой идентификатор быть связанным, прежде чем что-либо в его блоке кода* будет выполнено.
Это отличается от присвоения с function
выражение, которое оценено в нормальном нисходящем порядке.
, Если Вы изменили пример для высказывания:
var internalFoo = function() { return true; };
это прекратило бы работать.
объявление функции является синтаксически довольно отдельным от выражения function, даже при том, что они выглядят почти идентичными и могут быть неоднозначными в некоторых случаях.
Это документируется в стандарт ECMAScript , разделите 10.1.3 . К сожалению, ECMA-262 не является очень читаемым документом даже по стандартам стандартов!
*: содержание функции, блока, модуля или сценария.
Браузер читает Ваш HTML с начала до конца и может выполнить его, поскольку он читается и анализируется в исполняемые блоки (объявления переменной, функциональные определения, и т.д.), Но в любой точке может только использовать то, что было определено в сценарии перед той точкой.
Это отличается от других контекстов программирования, которые обрабатывают (компилируют) весь Ваш исходный код, возможно, связывают его вместе с любыми библиотеками, необходимо разрешить ссылки и создать исполняемый модуль, в котором начинается выполнение точки.
Ваш код может относиться к именованным объектам (переменные, другие функции, и т.д.), которые определяются далее вперед, но Вы не можете выполнить относящийся код, пока все части не доступны.
, Поскольку Вы знакомитесь с JavaScript, Вы станете глубоко знающий о Вашей потребности записать вещи в надлежащей последовательности.
Пересмотр: Для подтверждения принятого ответа (выше) используйте Firebug для продвижения хотя раздел сценария веб-страницы. Вы будете видеть, что он пропускает от функции до функции, посещая только первую строку, прежде чем это на самом деле выполнит любой код.
Некоторые языки имеют требование, чтобы идентификаторы были определены перед использованием. Причина этого состоит в том, что компилятор использует единственную передачу на исходном коде.
, Но если существует несколько передач (или некоторые проверки отложены) Вы можете совершенно живой без того требования. В этом случае код, вероятно, сначала читается (и интерпретируется), и затем ссылки установлены.
По той же причине следующее будет всегда помещать foo
в глобальное пространство имен:
if (test condition) {
var foo;
}
Я только использовал JavaScript немного. Я не уверен, поможет ли это, но это выглядит очень похожим на то, о чем Вы говорите и можете дать некоторое понимание:
http://www.dustindiaz.com/javascript-function-declaration-ambiguity/
Тело функции "internalFoo" должно пойти куда-нибудь при парсинге времени, поэтому когда код читается (иначе анализирующий) интерпретатором JS, структура данных для функции создается, и имя присвоено.
Только позже, тогда код выполняется, JavaScript на самом деле пытается узнать, существует ли "internalFoo" и что это и можно ли это назвать, и т.д.