Подтвердить что ты не робот

Целевая цепочка в Javascript

Я читал цепочку областей видимости в Javascript, но для меня это не имело никакого смысла, кто-нибудь мог бы сказать мне, что такое цепочка областей видимости и как она работает с графикой или что-то, что может понять даже идиот. Я гуглил это, но я не нашел что-то понятное :(

4b9b3361

Ответ 1

Чтобы понять цепочку областей действия, вы должны знать, как работают замыкания.

Закрытие происходит, когда вы вставляете функции, внутренние функции могут ссылаться на переменные, присутствующие в их внешних закрывающих функциях, даже после того, как их родительские функции уже выполнены.

JavaScript разрешает идентификаторы в определенном контексте, перемещая цепочку областей видимости, перемещаясь с локального на глобальный.

Рассмотрим этот пример с тремя вложенными функциями:

var currentScope = 0; // global scope
(function () {
  var currentScope = 1, one = 'scope1';
  alert(currentScope);
  (function () {
    var currentScope = 2, two = 'scope2';
    alert(currentScope);
    (function () {
      var currentScope = 3, three = 'scope3';
      alert(currentScope);
      alert(one + two + three); // climb up the scope chain to get one and two
    }());
  }());
}());

Рекомендуемые данные:

Ответ 2

Любой вызов функции в ECMAScript (основной язык, на котором основан JS) создает отдельный контекст выполнения, который запускается отдельно друг от друга. Внутри каждого контекста выполнения this относится к рассматриваемому объекту, по умолчанию к любому объекту, к которому прикреплена функция.

function foo() {
    alert(this===window)
}

Выдает предупреждение true, потому что окно является объектом, которому принадлежит метод 'foo'. Любые переменные, определенные в функции, становятся доступны через уникальную цепочку области действия этой среды.

function world() {
    var name = 'global';
    alert(name)
}

явно предупредит "глобальный".

function world() {
    var name = 'global';
    (function() {
        var name = 'country';
        alert(name)
    })();
    alert(name)
}

В последнем примере, когда вызывается первое предупреждение, Javascript определяет, что в цепочке областей действия внутренней функции определен идентификатор name, поэтому ему не нужно искать цепочку областей действия, чтобы получить его.

Во втором вызове оповещения name также определен в том же контексте и оповещения "глобальные";

function world() {
    var name = 'global';
    (function() { alert(name) })();
}

В этом примере идентификатор name не определен в том же контексте, и поэтому он должен перемещаться вверх по цепочке областей видимости во внешнюю функцию, где определено имя, и он оповещает о глобальном.

Ссылка:

Ответ 3

Это о закрытии. Вы можете использовать внешние переменные из области видимости во внутренней области:

function get_inner_scope () {
    var outer = 'Outer variable value';
    return function () {
        alert(outer);
    }
}
f = get_inner_scope();
f(); // alerts Outer variable value

Более подробная информация с другими образцами по первой ссылке google: http://blogs.msdn.com/jscript/archive/2007/07/26/scope-chain-of-jscript-functions.aspx

Ответ 4

Я знаю, что это старый пост, но он по-прежнему полезен для разработчиков. Я хотел сделать это немного по-другому, так как для новичков было бы более дружелюбным понимать масштабы цепочки. Вот моя измененная версия кода:

var currentScope = 0; // global scope
function a () {
   var currentScope = 1, one = 'scope1';
   alert(currentScope);

  function b () {
      var currentScope = 2, two = 'scope2';
      alert(currentScope);

      function c () {
         var currentScope = 3, three = 'scope3';
         alert(currentScope);
  alert(one + two + three); // climb up the scope chain to get one and two
     }
     c();
  }
  b();
}
a();

Ответ 5

Цепочка привязки в Javascript, объясненная в нестандартных условиях

Алекс - счастливый парень, В один прекрасный день, идущий по дороге с ежемесячной зарплатой в руке, получает грабеж.

Позже он понимает, что завтра последний день должен заплатить за дочери за 1000 долларов.
Он бежит домой, находит свои сбережения в 400 долларов, беспокоится обо всем остальном (600 $). Непосредственная мысль, что вспыхивает, заключается в том, чтобы заимствовать у своего отца Мэтью.
Мэтью, бедный плотник, лишенный каких-либо денег, продает свой унаследованный браслет за 300 $и придает его сыну Алексу.
Алекс, имеющий хорошую репутацию в обществе, сразу же получает оставшиеся 300 долларов в местном банке и своевременно оплачивает свою дочь.

Возвращение к цепочке областей в Javascript:
Функция Alex-A в javascript
Мэтью. Непосредственная функция, Алекс вложен. Родители Мэтьюза. Непосредственная функция Мэтью вложена.
Банковские переменные.

function Bank() {
    loan=300;
    Mathew();

    function Mathew() {
        mathew=300;
        Alex();

        function Alex() {
            savings:400;
            alert('I need some money');
        }

    }

}

Bank();

Целевая цепочка Alex на данный момент выглядит так: [экономия: 400] + [Mathew: 300] + [кредит: 300];

Ответ 6

Резюме:

Цепочка контекста используется для разрешения значения имен переменных в javascript. Без цепочки областей видимости движок Javascript не знал бы, какое значение выбрать для определенного имени переменной, если в разных областях определены несколько значений. Цепочка областей действия в javascript определена лексически, что означает, что мы можем видеть, какой будет цепочка областей действия, посмотрев код.

В верхней части цепочки областей видимости находится глобальная область видимости, которая является объектом window в браузере (global в NodeJS). Помимо глобальной области, функции имеют собственную область видимости переменных. Цепочка областей действия может быть определена путем просмотра того, где определены функции.

При разрешении переменной внутренние функции сначала смотрят на свою область видимости. Если переменная не может быть найдена в ее собственной области видимости, она поднимется по цепочке областей действия и будет искать имя переменной в среде, где была определена функция. Это выглядит так:

Scope chain javascript

Таким образом, в нашем примере изображения, когда innerFoo использует переменную bar, он сначала пытается найти ее в области видимости innerFoo (код в теле функции). Затем, когда он не находит его здесь, он поднимается вверх по цепочке областей действия к foo. В foo также нет переменной с именем bar. Следовательно, он поднимется вверх по цепочке областей действия и теперь заглянет в глобальную область. В глобальной области видимости находится переменная с именем bar со значением 10, в которую будет преобразован bar.

Пример:

let foo = 1;
let bar = 1;


function test (bar) {
   
   return function innerTestFunc () {
      let foo = 10;
      
      console.log(foo, bar);
    }
  
}

const innerTestFunc1 = test(5);
const innerTestFunc2 = test(20);


innerTestFunc1();  // logs 10, 5

innerTestFunc2();  // logs 10, 20