Скачать презентацию Исполняемый код и контекст исполнения в JS Дмитрий Скачать презентацию Исполняемый код и контекст исполнения в JS Дмитрий

5. Нефедов. Исполняемый код и контекст исполнения в JS (2).pptx

  • Количество слайдов: 16

Исполняемый код и контекст исполнения в JS Дмитрий Нефедов Старший программист группы систем электронной Исполняемый код и контекст исполнения в JS Дмитрий Нефедов Старший программист группы систем электронной коммерции Спортмастер Россия mailto: nefedov. du@gmail. com

В JS нет магии : ) var a = 5; function foo() { console. В JS нет магии : ) var a = 5; function foo() { console. log(a); } function bar() { foo(); console. log(a); var a = 6; } bar();

Область видимости Статическая область видимости: Динамическая область видимости: var x = 10; function foo() Область видимости Статическая область видимости: Динамическая область видимости: var x = 10; function foo() { console. log(x); } procedure foo() print(x) end foo(); // 10 function bar() { var x = 20; console. log(x); // 20 foo(); // 10 } bar(); foo() // 10 procedure bar() x = 20 foo() // 20 end bar()

Лексическая область видимости ● Спецификация, используемая для определения связи идентификаторов с конкретными значениями и Лексическая область видимости ● Спецификация, используемая для определения связи идентификаторов с конкретными значениями и функциями; ● Связано с синтаксической структурой кода, такой как Function. Declaration, Block. Statement, Catch и Try. Statement; ● Состоит из записи окружения и ссылки на внешнее лексическое окружение;

Пример: var x = 10; function foo() { var y = 20; } global. Пример: var x = 10; function foo() { var y = 20; } global. Environment = { environment. Record: { Object: function, // etc. . . x: 10 }, outer: null }; foo. Environment = { environment. Record: { y: 20 }, outer: global. Environment };

Пример: function foo() { var x = 10; function bar() { var y = Пример: function foo() { var x = 10; function bar() { var y = 20; console. log(x + y); // 30 } function baz() { var z = 30; console. log(x + y); // 40 } } foo. Environment = { environment. Record: {x: 10}, outer: global. Environment }; bar. Environment = { environment. Record: {y: 20}, outer: foo. Environment }; baz. Environment = { environment. Record: {z: 30}, outer: foo. Environment };

Типы записей окружения ● Декларативные записи Каждая декларативная запись среды связана с областью программы Типы записей окружения ● Декларативные записи Каждая декларативная запись среды связана с областью программы ECMAScript, содержащей объявления переменных, констант, let, class, module, import и / или функций. Декларативная запись среды связывает набор идентификаторов, определенных объявлениями, содержащимися в его области. ) ● Объектные записи Запись объектной среды используется для определения связи переменных и функций, появившихся в глобальном контексте и внутри with-операторов.

Вид декларативной записи окружения function foo(a) { var b = 10; function c() {} Вид декларативной записи окружения function foo(a) { var b = 10; function c() {} } environment = { // storage environment. Record: { type: "declarative", a: <. . . >, b: <. . . >, c: <. . . > }, // reference to the parent environment outer: <. . . > };

Пример объектной записи окружения var a = 10; var b = 20; with ({a: Пример объектной записи окружения var a = 10; var b = 20; with ({a: 30}) { console. log(a + b); // 50 } console. log(a + b); // 30, restored context. lexical. Env = { environment. Record: {a: 10, b: 20}, outer: null }; previous. Env = context. lexical. Env; with. Env = { environment. Record: {a: 30}, outer: context. lexical. Env }; context. lexical. Env = with. Env; context. lexical. Env = previous. Env;

Контекст исполнения ● This ● Переменные компоненты среды ● Лексические компоненты среды Execution. Context Контекст исполнения ● This ● Переменные компоненты среды ● Лексические компоненты среды Execution. Context = { This. Binding: , Variable. Environment: {. . . }, Lexical. Environment: {. . . }, }

This ● В глобальном контексте this - глобальный объект ● Внутри контекста функции this This ● В глобальном контексте this - глобальный объект ● Внутри контекста функции this определяется формой вызова функции var foo = { bar: function () { console. log(this); }; }; foo. bar(); // "this" === "foo" var bar = foo. bar; bar(); // "this" === global this. bar(); // "this" === global bar. prototype. constructor(); // "this" === "bar. prototype" // --- non-Reference cases --(foo. bar = foo. bar)(); // "this" === "global" or "undefined" (foo. bar || foo. bar)(); // "this" === "global" or "undefined" (function () {this; })(); //"this" === "global" || "undefined"

Переменные компоненты среды function foo(a) { var b = 20; } foo(10); foo. Context. Переменные компоненты среды function foo(a) { var b = 20; } foo(10); foo. Context. Variable. Environment = { environment. Record: { arguments: {0: 10, length: 1, callee: foo}, a: 10, b: 20 }, outer: global. Environment };

Лексические компоненты среды var a = 10; foo. [[Scope]] = global. Context. [[Variable. Environment]]; Лексические компоненты среды var a = 10; foo. [[Scope]] = global. Context. [[Variable. Environment]]; function foo() {console. log(a); } // "with" previous. Environment = global. Context. [[Lexical. Environment]]; with ({a: 20}) { var bar = function () { console. log(a); }; foo(); // 10, from Variable. Env bar(); // 20, from Lexical. Env } foo(); // 10 bar(); // still 20 global. Context. [[Lexical. Environment]] = { environment. Record: {a: 20}, outer: previous. Environment }; // "bar" is created bar. [[Scope]] = global. Context. [[Lexical. Environment]]; // "with" is completed, restore the environment global. Context. [[Lexical. Environment]] = previous. Environment;

Инициализация идентификаторов Процесс определения значения идентификатора, появившегося в контексте, с использованием лексического компонента в Инициализация идентификаторов Процесс определения значения идентификатора, появившегося в контексте, с использованием лексического компонента в текущем контексте выполнения function resolve. Identifier(lexical. Environment, identifier) { // если метод вызван из конечного окружения, переменной нет if (lexical. Environment == null) { throw Reference. Error(identifier + " is not defined"); } // если значение найдено, возвращаем его Reference if (lexical. Environment. has. Binding(identifier)) { return new Reference(lexical. Environment, identifier); } return resolve. Identifier(lexical. Environment. outer, identifier); }

Пример var a = 10; (function foo() { var b = 20; (function bar() Пример var a = 10; (function foo() { var b = 20; (function bar() { var c = 30; console. log(a + b + c); // 60 })(); resolve. Identifier(bar. [[Lexical. Environment]], "a") -> -- bar. [[Lexical. Environment]] - not found, -- bar. [[Lexical. Environment]]. outer -> foo. [[Lexical. Environment]]) -> not found -- bar. [[Lexical. Environment]]. outer -> found reference, value 10

Спасибо за внимание! Спасибо за внимание!