Это особый объект внутри функции. Это относится к объекту окружающей среды на основе которого выполняется функция (мы сделаем дополнительные объяснения в конце статьи). Значение этого не является определенным, прежде чем вызовать функцию. Различные методы вызова приведут к изменению этого значения.
window.num = 22; var o = {num: 11}; function specilenum () {alert (this.num)} saynum (); // 22o.saynum = saynum; o.saynum (); // 11Помните: имя функции - это просто переменная, содержащая указатель. Следовательно, даже если выполнять в разных средах, глобальная функция saynum () остается той же функцией, что и o.saynum ().
1. При вызове функции в глобальном объеме
В глобальном масштабе, этот объект относится к окну
Выполнение анонимных функций является глобальным, поэтому его объект обычно указывает на окно.
функция fn1 () {console.log (this);} fn1 ();2. Вызван через нового оператора
Это ссылается на объект экземпляра
Функция Person (name) {this.name = name;} person.prototype.printname = function () {alert (this.name); // byron}; var p1 = new Person ('byron');3. Метод вызовы в виде объектов
Это ссылается на объект
var obj1 = {name: 'byron', fn: function () {console.log (this); }}; obj1.fn ();4. Косвенный звонок
позвонить и применить
Каждая функция содержит два неэнергетических метода: call () и Apply (). Цель этих двух методов состоит в том, чтобы вызовать функции в определенной области, что фактически эквивалентно установлению значения этого объекта в корпусе функции. Другими словами, функция называется непосредственно, и среда выполнения указывается при вызове
window.color = 'red'; var o = {color: 'blue'}; function shaycolor () {alert (this.color);} saycolor.call (this); // redsaycolor.call (window); // redsaycolor.call (o); // blue (window); // redsaycolor.call (o); // blue.call (window);(1) Применить метод
Получить два параметра, один из них - это область функции, работающей в функции, а другой - массив параметров.
(2) Метод вызова
Метод вызова такой же, как и метод применения, разница в том, что метод получения параметров отличается. Для метода вызова первым параметром является то, что это значение не изменилось, и изменение состоит в том, что другие параметры напрямую передаются функции.
function fn () {console.log (this) // windwow function innerfn () {console.log (this)} innerfn.call (this) // window} fn (); function fn0 () {console.log (this) // window} function fn1 () {fn0.call (this); console.log (this); // window} fn1 (); function fn0 () {console.log (this) // объект} var o = {fn1: function fn1 () {fn0.call (this); console.log (this); // объект}} o.fn1 ();5. Способный метод
Этот метод создает экземпляр функции, значение которой связано с значением, передаваемым функции bind (). То есть будет возвращена новая функция, и эта внутри функции будет первым параметром.
window.color = 'red'; var o = {color: 'blue'}; function shaycolor () {alert (this.color)} var objectcolor = saycolor.bind (o); objectsaycolor (); // blueДополнительное примечание: определение среды выполнения
Определяет переменные или другие данные, которые функции имеют разрешение на доступ. Каждая среда выполнения имеет переменный объект, связанный с ним. Все переменные и функции, определенные в среде, хранятся в этом объекте. Код, который мы пишем, не может получить доступ к этому объекту, но анализатор будет использовать его в фоновом режиме при обработке данных.
1. Создание среды исполнения:
1. Глобальная среда исполнения
В веб -браузере глобальная среда выполнения считается окно -объектом, поэтому все глобальные переменные и функции создаются как свойства и методы окна. Когда код загружается в браузер, создается глобальная среда выполнения (глобальная среда выполнения разрушается только тогда, когда мы закрываем веб -страницу или браузер).
2. Местная среда исполнения
Каждая функция имеет свою собственную среду выполнения, поэтому локальная среда выполнения является объектом функции. Когда вызывается функция, создается локальная среда функции (после выполнения кода в функции, среда разрушается, и все определения переменных и функций, хранящихся в нем, также разрушаются).
Эта среда выполнения и связанные с ними объекты переменной являются абстрактной концепцией, объясненной следующим образом
var a = 1; function fn (num1, num2) {var b = 2; function fninner () {var c = 3; оповещение (A + B + C); } fninner (); // Локальное создание среды выполнения, когда fninner называется} fn (4,5); // Создание среды локального исполнения, когда FN вызывается2. Цепочка применения
В выполнении функций JavaScript используется цепочка сцепления. Эта цепочка областей создается, когда функция определена. Когда функция определяется, она фактически сохраняет цепочку применения. Когда эта функция вызвана, она создает новый объект для хранения своих локальных переменных и добавляет этот объект в сохраненную цепочку области. Передняя часть цепочки сфера является всегда переменным объектом в среде, где расположен в настоящее время выполняемый код. Конец цепочки объема всегда является переменным объектом глобальной среды выполнения. Цель цепочки объема состоит в том, чтобы гарантировать, что все переменные и функции, которые имеют разрешение на доступ к среде выполнения, разрешается доступ к доступу.
var scope = 'global scope'; function checkscope () {var scope = 'локальный объем'; Функция f () {return Scope}; return f;} checkscope () (); // локальная областьПонимание: Когда называется CheckScope, функция F определяется и связана с цепочкой сферы контроля в качестве локальной переменной. Следовательно, независимо от того, куда называется функция F, эта привязка все еще действительна, поэтому возвращаемое значение является локальной областью.
var num1 = 1; function over () {var num2 = 2; console.log (num1 + num2); // 3 function inner () {// здесь вы можете получить доступ к Num3, num2, num1 var num3 = 3; console.log (num1 + num2 + num3); // 6} // Здесь вы можете получить доступ num2, inner (), num1, но не num3 inner ();} out uper (); console.log (num1); // 1, среда выполнения // Здесь можно только получить доступ к num1Цепочка областей (Search Up): Внутренняя среда может получить доступ ко всем внешним средам через цепочку областей, но внешняя среда не может получить доступ к каким -либо переменным и функциям во внутренней среде.
var name = 'byron'; функция fn () {var name = 'csper'; console.log (name); // casper} fn ();Чем более внутренняя среда, тем выше переменный вес.
Примечание. Переменные, которые не объявляются напрямую с помощью ключевого слова VAR, являются глобальными переменными. Например, если A = 1 объявлен непосредственно, A является глобальной переменной в настоящее время.
Когда двигатель Javscript вступит в объем, он обработает код в двух раундах. Первый раунд, инициализируйте переменные. Второй раунд выполните код
var a = 1; функция тюрьмы (a) {console.log (a); // 1 var a; console.log (a); // 1} тюрьма (1);3. Функция выполнения
Когда вызов функции входит в среду выполнения, сначала процесс аргументов инициализируйте формальные параметры (значение по умолчанию не определена), а затем инициализируйте объявление функции в функции. Когда код выполняется шаг за шагом, объявление переменной в функции инициализируется (когда код не выполняется после входа в среду, значение не определена). Следовательно, порядок инициализации в функции - это формальные параметры, объявления функций и объявления переменных. Это можно увидеть с изображения выше. Позвольте мне привести вам пример (вся глобальная среда также является функцией).
Alert (typeOf fn); // Функция, Объявление функции заранее предупреждает (typeOf fn0); // не определенное, объявление переменной заранее, но не назначенная функция fn () {// Выражение функции} var fn0 = funct