Тело функции "internalFoo" должно пойти куда-нибудь при парсинге времени, поэтому когда код читается (иначе анализирующий) интерпретатором JS, структура данных для функции создается, и имя присвоено.
Только позже, тогда код выполняется, JavaScript на самом деле пытается узнать, существует ли "internalFoo" и что это и можно ли это назвать, и т.д.
В C # это слева направо: http://blogs.msdn.com/oldnewthing/archive/2007/08/14/4374222.aspx
Re: Порядок C ++
По-видимому, это потому, что компилятор не может гарантировать, в каком порядке выполняются функции (... почему?)
Любой конкретный компилятор может гарантировать порядок. Проблема в том, что в спецификации языка не указан порядок, поэтому каждый компилятор может делать все, что захочет.
From Fabulous Adventures in Coding: Precedence vs Associativity vs Order :
Другой способ взглянуть на это - это правило C # не «сделайте сначала скобки. ", а вместо того, чтобы заключить все в скобки, затем рекурсивно примените правило" оцените левую сторону, затем оцените правую сторону, затем выполните операцию ".
В книге говорится, что, поскольку - и / не являются коммутативными операторами, порядок, в котором вычисляются 2 функции pop, необходим (очевидно, чтобы получить правильный результат) ... и, таким образом, вы должны сначала поместить результат первой функции в переменную, а затем продолжить арифметические операции.
Это не совсем правильно. K&R разрешил перестановку коммутативных операторов ( отменено в ANSI C ). Поскольку всасывание не коммутативно, оно не переупорядочивается ... по крайней мере по этому правилу.
(Un) к счастью, C также не делает »
Я считаю, что в C # список аргументов оценивается по порядку, слева направо.
Цвет меня удивил, но, очевидно, C # делает "правильные" вещи и оценивает слева направо:
void Main()
{
Console.WriteLine(Pop() - Pop()); // Prints -1
}
// Define other methods and classes here
bool switchVar = true;
int Pop()
{
int ret;
if (switchVar)
ret = 1;
else
ret = 2;
switchVar = !switchVar;
return ret;
}
Чтобы ответить на ваш вопрос о том, почему C не определяет порядок операции, это просто потому, что изобретатели C решили, что было бы полезно дать разработчикам компилятора возможность оптимизировать оценку выражений. Они также решили, что это было более ценно, чем предоставление программистам уверенности в оценке выражений.
Помните, что когда изначально C был разработан, машины были гораздо менее способными, чем сегодня, и было больше интереса предоставить компиляторам свободу действий для оптимизации. Сегодня часто больше внимания уделяется более безопасному и более предсказуемому коду.
Нет, C # не делает то же самое. Он не использует границы оценки так же, как C, где порядок выполнения между границами не определен. Выражение вычисляется слева направо, как и следовало ожидать.
Если вы когда-либо не уверены в порядке выполнения или хотите сделать код более понятным, вы должны использовать локальную переменную для промежуточного результата. Локальные переменные очень дешево выделять, поскольку они размещаются в стеке, а в некоторых случаях компилятор даже может поместить переменную в регистр, чтобы она вообще не выделялась. Кроме того, в зависимости от того, как выглядит выражение, компилятору в любом случае может потребоваться использовать локальную переменную для хранения промежуточного результата.
Порядок оценки во всех случаях четко определен в C # и выполняется слева направо. Из спецификации языка C # (§7.3):
Порядок вычисления операторов в выражении определяется приоритетом и ассоциативностью операторов (§7.2.1). Операнды в выражении оцениваются слева направо. Например, в F (i) + G (i ++) * H (i) метод F вызывается с использованием старого значения i, затем метод G вызывается со старым значением i, и, наконец, вызывается метод H с новым значением i. Это отдельно от приоритета операторов и не связано с ним
В случае C ++ это не значит, что порядок нельзя определить; это то, что разрешение порядка быть неопределенным позволяет компилятору лучше оптимизировать код.