Я читал книгу Кайла Симпсона Scopes and Closure of You not know JS, особенно эту тему Compiler Speak.
Там они упоминают поиск слева и справа. Мне не удалось понять эти два термина, может ли кто-нибудь помочь мне их понять?
Я читал книгу Кайла Симпсона Scopes and Closure of You not know JS, особенно эту тему Compiler Speak.
Там они упоминают поиск слева и справа. Мне не удалось понять эти два термина, может ли кто-нибудь помочь мне их понять?
Поиск с левой стороны выполняется, когда переменная появляется в левой части операции присваивания, а поиск с правой стороны выполняется, когда переменная появляется с правой стороны операции присваивания.
Я думаю об этом следующим образом:
поиск по левому краю — это поиск по контейнеру
поиск по правому краю — это поиск по значению
Не думайте об этом как о присваивании левой или правой стороны, думайте об этом как о сохранении значения в памяти и извлечении его позже.
Например, когда вы вводите 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
.
Простой пример из той же книги, которую вы упомянули
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 из приведенного выше примера -**
4 RHS из приведенного выше фрагмента кода
Редактировать:
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();
Я думаю об этом следующим образом: левый поиск — это поиск контейнера, правый поиск — поиск значения.
Мне очень нравится подход Кайла Симпсона, но именно это короткое объяснение донесло до меня ясно и ясно.
Всегда есть компромисс между «просто сказать то, что мне нужно знать, и ничего более» и углубиться, чтобы лучше понять на более глубоком уровне.
Иногда это глубокое понимание может помочь вам избежать неприятностей при отладке, написании тестового кода, оптимизации и рефакторинге.
В настоящее время я читаю и смотрю много сочинений Кайла и онлайн-преподавания, у него действительно есть умение хорошо объяснять вещи. Многие инструкторы теряют людей по пути либо из-за того, что идут слишком быстро, потому что у них есть опыт, и им трудно замедлиться - с другой стороны, если вы слишком углубитесь в основы, разговор станет неинтересным, и вы просто отключитесь.
Или коротко:
RHS - для поиска по чтению
LHS - для поиска записи
x==1
, а также допустимого1==x
. - person Peter Krauss   schedule 29.12.2018