Объясните инкапсулированный синтаксис анонимной функции

Ну, похож, я ответил на свой собственный вопрос.

LogParser.exe -i:IISW3C 
"SELECT COUNT(cs(User-Agent)) AS Client 
FROM *.log WHERE STRLEN(cs(User-Agent)) > 100"
364
задан GG. 23 December 2016 в 22:00
поделиться

1 ответ

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

В мире воображения я бы сказал, что адаптация метациркулярного интерпретатора LISP Джона Маккарти была бы весьма неплохой. Закрыть. Вы также можете посмотреть на Джона Рейнольда ' s paper Определительные интерпретаторы для языков высшего порядка , которые, хотя и являются плотными, являются образцом простоты.

В мире реальности я бы сделал ставку на Chez Scheme , но, к сожалению, Компилятор с собственным кодом является закрытым исходным кодом. Тем не менее, вы можете научиться чему-то, изучая переводчика. Еще одна система, которую стоит изучить, - это компилятор Oberon , который был разработан, чтобы его мог собрать и понять один человек, и он очень чистый.

что означает код вне глобальной области видимости и внутри FunctionBody других функций.

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

 if (true) { функция foo () {предупреждение ('истина'); }} еще {функция foo () {предупреждение ('ложь!'); }} foo (); // правда? ложный? почему? 

Приведенный выше код должен фактически вызвать ошибку SyntaxError , поскольку блок может содержать только операторы (а спецификация ECMAScript не определяет никаких операторов функций), но большинство реализаций являются толерантными и просто будут использовать вторую функцию, которая предупреждает «ложь!» .

Реализации Mozilla -Rhino, SpiderMonkey - имеют другое поведение. Их грамматика содержит нестандартное описание функции, это означает, что функция будет оцениваться во время выполнения , а не во время синтаксического анализа, как это происходит с FunctionDeclaration s. В этих реализациях мы получим первую определенную функцию.


Функции могут быть объявлены по-разному, сравните следующие :

1- Функция, определенная с помощью конструктора Function присвоено переменной multiply :

var multiply = new Function("x", "y", "return x * y;");

2- Объявление функции с именем multiply :

function multiply(x, y) {
    return x * y;
}

3- Выражение функции, присвоенное переменной multiply :

var multiply = function (x, y) {
    return x * y;
};

4- Выражение именованной функции func_name , присвоенное переменной multiply :

var multiply = function func_name(x, y) {
    return x * y;
};
399
ответ дан 23 November 2019 в 00:10
поделиться
Другие вопросы по тегам:

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