JavaScript LHS и RHS Lookup

Я читал книгу Кайла Симпсона Scopes and Closure of You not know JS, особенно эту тему Compiler Speak.

Там они упоминают поиск слева и справа. Мне не удалось понять эти два термина, может ли кто-нибудь помочь мне их понять?


person ZIS    schedule 03.04.2016    source источник
comment
посмотрите: en.wikipedia.org/wiki/Sides_of_an_equation   -  person Nina Scholz    schedule 03.04.2016
comment
возможный дубликат stackoverflow.com/questions/3709866/   -  person Nina Scholz    schedule 03.04.2016
comment
Пожалуйста, цитируйте соответствующие части книги.   -  person    schedule 03.04.2016
comment
Наиболее часто этот термин используется в отношении стиля, популярного x==1, а также допустимого 1==x.   -  person Peter Krauss    schedule 29.12.2018


Ответы (6)


Поиск с левой стороны выполняется, когда переменная появляется в левой части операции присваивания, а поиск с правой стороны выполняется, когда переменная появляется с правой стороны операции присваивания.

Я думаю об этом следующим образом:
поиск по левому краю — это поиск по контейнеру
поиск по правому краю — это поиск по значению

person Ahmed Eid    schedule 20.09.2016

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

Например, когда вы вводите b в консоли разработчика Chrome, он запускает поиск RHS (получает значение b) и, если значение не найдено, выдает ReferenceError.

Напротив, когда вы вводите b = 2 в консоли разработчика Chrome, он запускает поиск LHS, и если b не найден во вложенной области, компилятор JS объявляет его в глобальной области (в зависимости от того, используете ли вы код в strict mode или нет).

Например, примите во внимание следующий код

function foo(a) {
    console.log( a + b)
}

foo( 2 );

Когда компилятор JS выполняет код, он сначала ищет функцию foo и определяет, объявлена ​​ли она в текущей области (здесь среда размещения), что называется поиском RHS. Теперь в области действия foo аргумент будет равен 2, и, поскольку мы объявили функцию foo(a), когда писали foo( 2 ), мы неявно присваиваем значение 2 a или a = 2, что называется LHS lookup (присваивая значение 2 a), теперь перемотаем вперед компилятор снова придет к строке console.log( a + b), он будет искать значения a и b (снова поиск RHS), и если значения будут найдены, он назначит их аргументу console.log (если вы предполагаете, что console.log определяется как console.log(arg1) в среде хостинга, тогда arg1 = value of a+b (что снова является поиском LHS).

Вкратце:

• когда механизм извлекает значение переменной console.log(b), он получает значение из ячейки памяти b. Это поиск RHS

• когда движок присваивает значение переменной b = 2, он ищет значение b в области видимости – если находит, устанавливает значение 2 в ячейку памяти b, если нет, то ищет в области видимости верхнего уровня. Это поиск LHS.

person Pradeepsinh Sindhav    schedule 09.04.2018

Простой пример из той же книги, которую вы упомянули

function foo(a) {
console.log( a ); // 2
}
foo( 2 );

LHS: когда вы передаете значение (2) методу foo, компилятор присваивает параметру значение a = 2, что называется LHS Lookup. Он просто найдет переменную контейнера для присвоения значения.

RHS: чтобы выполнить console.log для вывода a, нужна ссылка RHS для значения a. Это называется RHS Lookup.

Еще один пример

function foo(a) {
var b = a;
return a + b;
}
var c = foo( 2 );

3 LHS из приведенного выше примера -**

  1. c = (контейнер для возврата метода foo)
  2. a = 2 (когда вы передаете методу значение 2, компилятор назначит a = 2)
  3. б =

4 RHS из приведенного выше фрагмента кода

  1. foo(2) — для получения значения нужна ссылка
  2. = a — чтобы получить значение b , нужна ссылка a
  3. a — чтобы получить значение a , нужна ссылка a
  4. b — чтобы получить значение b, нужна ссылка на b

Редактировать:

person Code-EZ    schedule 27.05.2018
comment
мне нравится этот ответ - person Omar Hasan; 17.07.2020

LHS — поиск идентификатора для назначения целей или присвоения ему значения.

let foo;

// It's looking for foo identifier in global scope and assign value
// So it's an LHS 
foo = 1; 

// It's also LHS as it assigning new value
foo = 2;

Теперь, RHS - это означает, что когда вы ищете идентификатор, чтобы использовать его (не присваивать значение)

function foo() {
    alert(2);
}

// this look for an identifier called foo and 
// in global scope it's a function decoration 
// and execute it
foo();
person HADI    schedule 09.04.2018

Я думаю об этом следующим образом: левый поиск — это поиск контейнера, правый поиск — поиск значения.

Мне очень нравится подход Кайла Симпсона, но именно это короткое объяснение донесло до меня ясно и ясно.

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

Иногда это глубокое понимание может помочь вам избежать неприятностей при отладке, написании тестового кода, оптимизации и рефакторинге.

В настоящее время я читаю и смотрю много сочинений Кайла и онлайн-преподавания, у него действительно есть умение хорошо объяснять вещи. Многие инструкторы теряют людей по пути либо из-за того, что идут слишком быстро, потому что у них есть опыт, и им трудно замедлиться - с другой стороны, если вы слишком углубитесь в основы, разговор станет неинтересным, и вы просто отключитесь.

person Jack King    schedule 22.05.2017

Или коротко:

RHS - для поиска по чтению

LHS - для поиска записи

person maleta    schedule 06.11.2019