Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.10.2021, 08:08
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Скобки в Javascript
По идее Javascript никак не должен изменять и оптимизировать скобки.
Как написано, так и выполняется.

let x = a+(b+c);

будет и выполняться примерно как

let _;
_ = b+c;
x = a+_;


И никак иначе
Но.

'use strict'
const A = {
   f(x) {console.log (this, x)}
};

A.f (10);  // => {A}, 10

let t = A.f;

t(20) ;  // => undefined, 20

let _;
(_ = A.f) (30);   // => undefined, 30

(A.f) (40)  // => {A}, 40   Почему?


Разве последний случай не тоже самое, что

let _;
(_ = A.f) (40);


Ведь сначала должно выполнится действие в скобках, т.е "вычислить" A.f и потом вызвать этот результат, как функцию.
Ответить с цитированием
  #2 (permalink)  
Старый 15.10.2021, 08:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Нет. Скобки "что-то = что-то другое" это expression(вражение), т.е. у него есть результат.

Скобочки выполняют expression, результатом которого будет то, что лежит в "что-то" на конец операции.
Просто же "что-то" - это не выражение и работает как есть.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 15.10.2021, 08:54
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

В последнем случае интерпретатор просто выкидывает скобки за ненадобностью. Считается, что они тут бесполезны и ничего не меняют.
Известный пример - вызов "глобального eval":
(0,eval)(str)

Здесь евал не имеет доступа к внутреннему скоупу. Без "0," вызывается обычный.
Ответить с цитированием
  #4 (permalink)  
Старый 15.10.2021, 09:05
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

И действительно.

(null, A.f) (40)  // => undefined, 40


Хотя странно. Ведь вычисления в любом случае производятся. f может быть суровым геттером, который вычислят бог знает что, а потом выдает результат
Ответить с цитированием
  #5 (permalink)  
Старый 15.10.2021, 09:40
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Да и даже без геттера, просто доступ через точку - тоже вычисление.
Тут можно "логически обосновать" оба варианта. Просто выбрали один из двух. Типа, что "скобки не поменяют порядок вычислений", и потому их можно сначала выкинуть, а потом уже разбирать код.
Ответить с цитированием
  #6 (permalink)  
Старый 16.10.2021, 00:07
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Не стоит гадать и отгадывать.

JavaScript это формализованный язык программирования что означает что у него есть четкие правила (грамматики) с помощью которых выполняется синтаксический разбор. Все эти правила описаны в спецификации языка.

В первом случае «(_ = A.f) (30);» в части выражения «(_ = A.f)» есть оператор "=" который и превращает эту часть выражения в так называемый AssignmentExpression.
AssignmentExpression не может быть частью другого выражения.
Для выражения которое является частью другого выражения используют понятие MemberExpression (т.е. такое к которому можно добавить параметры и попробовать вызвать как функцию).
Кстати запятая в выражении то же делает выражение как AssignmentExpression https://262.ecma-international.org/8.0/#prod-Expression.
Ответить с цитированием
  #7 (permalink)  
Старый 16.10.2021, 15:37
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

На самом деле из синтаксиса ничего не следует
MemberExpression тут A.f
А (A.f) - это как раз AssignmentExpression. И знак = тут совершенно не при чем.
Но поведение объясняется в Runtime Semantics: Evaluation в примечании к п 12.2.10.4 https://262.ecma-international.org/8...ics-evaluation
Правда я не совсем понял при чем там typeof.
Ответить с цитированием
  #8 (permalink)  
Старый 16.10.2021, 19:30
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Если у меня появляются такие вопросы я использую AST парсер.
Синтаксическое дерево хорошо показывает структуру кода так как ее понимает интерпретатор.

https://astexplorer.net/
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Круглые скобки в javascript Nubi Общие вопросы Javascript 2 23.02.2013 04:45
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34