Введение
1. Тип ссылки
Ссылочный тип — это внутренний тип в JavaScript. В основном он используется в качестве ссылки, заменяя переменную или функцию. Конечно, когда требуется реальное значение, его можно найти с помощью него.
2. Структура ссылочного типа
Значение ссылочного типа состоит из двух частей: одна — это объект, которому принадлежит объект, на который ссылается значение ссылочного типа. Здесь мы называем его базовым, а другая — имя объекта в базе. Представлено в псевдокоде:
Скопируйте код кода следующим образом:
вар valueOfReferenceType = {
база: <базовый объект>,
propertyName: <имя свойства>
};
3.Сценарии использования
Существует два сценария использования ссылочных типов:
(1) При обработке идентификатора
Идентификаторы — это имена переменных, имена функций, имена параметров функций и имена нераспознанных свойств в глобальных объектах.
(2) При обработке метода доступа к свойству
Скопируйте код кода следующим образом:
вар фу = 10;
функциональная панель( ){}
В промежуточных результатах операции тип ссылки соответствует
Скопируйте код кода следующим образом:
вар fooReference = {
база: глобальная,
Имя свойства: 'фу'
};
вар barReference = {
база: глобальная,
Имя свойства: 'бар'
};
Здесь все еще необходимо объяснить основу. В JavaScript все объекты или функции имеют свои собственные объекты. Любой, кто читал мою предыдущую статью, знает, что в каждом контексте выполнения существует объект-переменная для управления переменными или функциями в этом контексте выполнения. .
Итак, при работе с идентификаторами:
В глобальном контексте само собой разумеется, что base === globalVO === global.
В контексте выполнения функции base === VO/AO.
Но свойства объекта обработки:
Это еще проще, base === owerObject
4. Получите истинное значение ссылочного типа.
Как мы говорили вначале, ссылочный тип — это всего лишь ссылка, но он не хранит реальное значение. Когда требуется реальная стоимость, ее можно получить с помощью ряда внутренних алгоритмов. Мы можем описать этот алгоритм простым псевдокодом:
Скопируйте код кода следующим образом:
функция GetValue(значение) {
if (Тип(значение) != Ссылка) {
возвращаемое значение;
}
вар база = GetBase (значение);
если (база === ноль) {
выбросить новую ReferenceError;
}
return base.[[Get]](GetPropertyName(значение));
}
Внутренний метод [[Get]] возвращает истинное значение свойств объекта, включая анализ наследуемых свойств в цепочке прототипов. Таким образом, с помощью GetValue мы также можем легко получить реальное значение ссылочного типа. Например:
Скопируйте код кода следующим образом:
ПолучитьЗначение(fooReference); // 10;
GetValue(barReference); // объект функции "бар";
Так когда же нам нужно получить реальное значение ссылочного типа?
Обычно, когда ссылочный тип необходимо назначить, принять участие в операции или вызвать, реальное значение необходимо получить с помощью метода GetValue. (Примечание. Объект, полученный с помощью GetValue, больше не является ссылочным типом.)
Связь между ссылочными типами и этим
Ссылочный тип в основном тесно связан с точкой this в контексте функции и в разное время выглядит совершенно по-разному, поэтому мы ввели ссылочный тип, чтобы конкретно объяснить производительность this в контексте функции.
Общие правила определения значения this в контексте функции следующие:
В контексте функции это предоставляется вызывающей стороной и определяется тем, как вызывается функция. Если левая часть вызывающей скобки () является значением ссылочного типа, это значение будет установлено в базовый объект значения ссылочного типа. В других случаях (любые другие свойства, отличные от ссылочного типа) это значение будет нулевым. . Однако в действительности не существует ситуации, когда значение this было бы нулевым, поскольку, когда значение this равно нулю, его значение будет неявно преобразовано в глобальный объект. Примечание. В пятой редакции ECMAScript преобразование в глобальные переменные больше не является обязательным, а присваивается неопределенному значению.
Ниже мы обсудим три ситуации, основанные на разнице в левой части вызывающей скобки:
(1) Левая часть вызывающей скобки — это значение ссылочного типа.
Это не требует слишком большого анализа. Базовый объект — это значение. Просто найдите базу. Если он объявлен в глобальной переменной, он указывает на глобальный объект.
Скопируйте код кода следующим образом:
вар myObject = {
фу: функция(){
console.log(это);
}
}
myObject.foo(); // Нет сомнений в том, что основой foo является myObject, поэтому в методе foo он указывает на myObject.
(2) Левая часть вызывающей скобки представляет собой значение ссылочного типа, но это значение равно нулю.
Скопируйте код кода следующим образом:
функция myFunction() {
вар foo = функция(){
console.log(это);
}
foo(); //AO.foo() => null.foo();
}
myFunction(); //Вывод: Окно {вверх: Окно, окно: Окно...}
Когда вызывается внутренняя функция, ее базой должен быть активный объект (OA) в текущем контексте выполнения. Однако в JavaScript, когда OA используется в качестве основы, JavaScript определенно не обрабатывается. пусть это значение равно нулю, вся база устанавливается на глобальный объект (это источник ошибки проектирования в предыдущем шаблоне вызова этой функции). Итак, в данном случае это указывает на глобальный объект.
(3) Вызовите значение в левой части скобки, которое не является ссылочным типом.
Скопируйте код кода следующим образом:
//Простой пример
(функция () {
console.log(this); // ноль => глобальный
})();
//Более сложный пример
вар фу = {
бар: функция () {
console.log(это);
}
};
foo.bar() // Ссылка, ОК => foo
(foo.bar)(); // Ссылка, ОК => foo
(foo.bar = foo.bar)(); // глобальный
(ложь || foo.bar)(); // глобально
(foo.bar, foo.bar)(); // глобальный
Если левая часть вызывающей скобки является не ссылочным типом, а другим типом, ему автоматически присваивается значение null, и результатом является глобальный объект.
В первом примере непосредственная функция имеет выражение в левой части скобки вызова функции, а не ссылку.
Второй пример гораздо сложнее, давайте разберем его по порядку:
foo.bar(), в этом нет никаких сомнений, base — это foo, и это указывает на foo.
(foo.bar)() здесь используется скобка, которая действует как символ группировки, то есть не заставляет ссылочный тип выполнять метод GetValue, а результат выполнения точно такой же, как указано выше.
Следующие три в скобках — это операции присваивания или операции и операции с запятыми. Все они заставляют ссылочный тип выполнять метод GetValue, тем самым возвращая объект функции. Таким образом, левая часть скобок вызова функции больше не является ссылочным типом и указывает на глобальный объект.
Подвести итог
Что касается ссылочных типов, я на самом деле мало что знаю об этом. Я только что увидел главу об этом в блоге дяди Тома. Чтобы объяснить принцип значения этого в режиме вызова функции, я провел специальный анализ. Удивительно! Я всегда думал, что между ссылочными типами и ссылкой по значению должна быть какая-то связь. Неожиданно он используется в bolg только для того, чтобы помочь понять это. Что касается того, была ли связь между ними раньше, и если была связь, то какого рода связь, мне все еще нужно продолжать учиться и исследовать.
Надеюсь, вы сможете больше общаться. Я хотел бы поблагодарить дядю Тома за это.