Основные значения типа: неопределенные, нулевые, логические, число и строка. Эти типы занимают пространство с фиксированным размером в памяти, и их значения сохраняются в пространстве стека, к которому мы получаем доступ к значению.
(1) Типы значений: числовые, логические, нулевые, неопределенные.
(2) Тип ссылки: объект, массив, функция.
Если назначенное значение является ссылочным типом, пространство должно быть выделено для этого значения в памяти кучи. Поскольку размер таких значений не является фиксированным (объекты имеют много свойств и методов), их нельзя сохранить в памяти стека. Тем не менее, размер адреса памяти фиксирован, поэтому адрес памяти можно сохранить в памяти стека.
<script type = "text/javascript"> var box = new object (); // Создать ссылочный тип var box = "lee"; // Основное значение типа - это строковая Box.age = 23; // Странно добавлять атрибуты к значениям основного типа, потому что только объекты могут добавлять атрибуты. оповещение (box.age); // это не ссылочный тип, и не может быть выводом; </script>
Короче говоря, память кучи хранит справочные значения, а память стека хранит значения фиксированных типов.
<script type = "text/javascript"> var man = new object (); // человек указывает на пространственный адрес памяти стека Man.name = "jack"; var man2 = man; // man2 получает адрес оповещения о направлении человека (man2.name); // оба всплывающего jack alert (man.name); </script>
Копировать значения переменной
Давайте посмотрим на следующий пример:
<script type = "text/javascript"> var man = new object (); // человек указывает на пространственный адрес памяти стека Man.name = "jack"; var man2 = man; // man2 получает адрес указательного адреса человека man2.name = "ming"; // Потому что все они указывают на один и тот же объект и одно и то же имя, независимо от того, кто изменен, все имеют изменение оповещения (man2.name); // оба всплывающего Ming Alert (man.name); </script>
Из вышесказанного мы можем видеть, что с точки зрения копирования переменной, основной тип и тип ссылки также различны. Основной тип копирует само значение, в то время как ссылочный тип копирует адрес.
Передайте параметры
В Ecmascript все параметры функций передаются значениями.
<script type = "text/javascript"> функциональное поле (num) {// пройти num по значению num+= 10; вернуть num; } var num = 10; var result = box (num); предупреждение (результат); // Если он передается ссылкой, то NUM в функции станет глобальной переменной, а число снаружи заменяется на Alert (NUM); // Другими словами, 20 должно быть выведено в конце (10 здесь выводится) </script>JavaScript не передается ссылкой. Если есть ссылка, переменные в функции будут глобальными переменными, а также могут быть доступны извне. Но это, очевидно, невозможно.
Среда исполнения и объем
Среда исполнения является одной из самых важных концепций в JavaScript. Среда выполнения определяет переменные или функции, которые имеют разрешение на доступ к другим данным.
Глобальная среда исполнения является наиболее периферической средой исполнения. В веб -браузере глобальная среда выполнения является оконным объектом. Следовательно, все функции глобальных переменных создаются как свойства и методы окон.
<script type = "text/javascript"> var name = "jack"; // определить глобальную функцию переменной setName () {return "trigkit4"; } alert (window.name); // Глобальная переменная, внешняя, принадлежит оповещению атрибута окна (window.setName ()); // Глобальная функция, самая внешняя, принадлежит методу окна </script>Когда код в среде выполнения выполняется, среда разрушается, а переменные и функции, сохраненные в нем, также разрушаются. Если это глобальная среда, все программы должны быть выполнены или веб -страница будет уничтожена.
Удалить локальные переменные VAR
<script type = "text/javascript"> var name = "jack"; функция setName () {name = "trigkit4"; // Удалить var и стать глобальной переменной} setName (); Alert (имя); // всплыть в Trigkit4 </script>Передача параметров, это также локальная переменная
<script type = "text/javascript"> var name = "jack"; function setName (name) {// Передача аргументов также является локальной переменной оповещением (имя); } setName ("trigkit4"); // op up trigkit4 alert (name); // op up jack </script>Функция также содержит функции, и только эта функция может получить доступ к внутреннему слою функций.
<script type = "text/javascript"> var name = "jack"; function setName () {function setyear () {// Применение метода setyear () в пределах setName () return 21; }} alert (setyear ()); // Невозможно получить доступ, ошибка </script>Вы можете получить доступ к нему:
<script type = "text/javascript"> var name = "jack"; function setName () {function setyear () {// Применение метода setyear () в пределах setName () return 21; } return setyear (); } alert (setName ()); // pop 21 </script>Еще один пример прицела:
<script type = "text/javascript"> var name = "jack"; function setName () {function setyear () {// Применение метода setyear () находится в setName () var b = "hi"; // Область переменной B находится в setyear () return 21; } alert (b); // недоступный} </script>Когда код будет выполнен в среде, будет сформировано что -то, что называется цепочкой применения. Его цель состоит в том, чтобы обеспечить упорядоченный доступ к переменным и функциям с правами доступа в среде выполнения (имея в виду доступ в соответствии с уровнем правила). Передний конец цепочки объема - это переменный объект среды выполнения.
Объем
Когда переменная не объявлена и не объявлена в функции, она является глобальной переменной и имеет глобальный объем. Все свойства оконного объекта имеют глобальный объем; К нему можно получить доступ в любом месте в коде, а переменные, объявленные внутри внутреннего и модифицированного VAR, являются локальными переменными, которые могут использоваться только в корпусе функции. Хотя параметры функции не используют VAR, они все еще являются локальными переменными.
Нет сферы на уровне блоков
Нет сферы на уровне блоков
// if оператор: <script type = "text/javascript"> if (true) {// Керлые скобки оператора if не имеют функции области. var box = "trigkit4";} alert (box); // popt up trigkit4 </script>То же самое относится и к операторам цикла.
Запрос переменных
В переменных запросах доступ к локальным переменным быстрее, чем глобальные переменные, поэтому нет необходимости искать цепочку областей.
Как показано в следующем примере:
<script type = "text/javascript"> var name = "jack"; function setName () {var name = "trigkit4"; вернуть имя; // Поиск переменных из нижнего слоя вверх} alert (setName ()); </script>Проблемы с памятью
JavaScript имеет автоматический механизм сбора мусора, и после того, как данные больше не используются, его можно настроить на «NULL», чтобы выпустить ссылку
Ссылка на переработку
Очень простой пример: объект DOM называет объектом JavaScript, и в то же время относится к тому же или другому объекту JavaScript. Этот объект DOM может вызвать утечку памяти. Ссылки на этот объект DOM не будут переработаны сборщиком мусора, когда сценарий остановлен. Чтобы сломать круговую ссылку, объект, который относится к элементу DOM или ссылке на объект DOM, должен быть назначен значение NULL.
Закрытие
При введении переменных вне закрытия в закрытие, этот объект не может быть собранным мусором (GC), когда закрытие заканчивается.
var a = function () {var lestr = new Array (1000000) .join ('x'); return function () {return lastgestr; }} ();DOM утечка
Когда оригинальный COM удаляется, ссылка на суб-узел не может быть переработана, если он не будет удален.
var select = document.queryselector; var treeref = select ('#tree'); // В дереве Com Leafref - это дочерний узел Treefre var leafref = select ('#leaf'); var body = select ('body'); body.removechild (treeref); // #дерево не может быть переработано, потому что Treeref все еще там // Решение: Treeref = null; // Дерево не может быть переработано, потому что Leafref все еще существует Leafref = null; // Теперь #tree не может быть выпущено.Утечка таймеров (определение) утечки таймера
Таймеры также являются обычными местами, где возникают утечки памяти:
for (var i = 0; i <90000; i ++) {var buggyObject = {callagain: function () {var ref = this; var val = settimeout (function () {ref.callagain ();}, 90000); }} buggyObject.callagain (); // хотя вы хотите переработать, таймер по -прежнему остается buggyobject = null;}Отладка памяти
Инструмент отладки памяти Chrome может легко просматривать использование памяти и утечки памяти:
Нажмите «Запись» в временной шкале -> Память: