Рубрики
Без рубрики

Понимание функций Scopes и Block Scopes в JavaScript

Если вы начинаете и испытываете трудности понимать функции Scopes и Block Scopes, то этот учебник JavaScript для вас!

Автор оригинала: Samer Buna.

Это первоначально опубликовано автором на его Блог Отказ Этот пост был отредактирован для ясности, а некоторые детали могут появиться отличаться от исходного поста.

Следующая строка действительная строка JavaScript Code?

{{{}}}

Да, это.

Это вложенные блокировки.

Блокировать область

Симпатики блоков отличаются от функций Scopes в JavaScript. Для любой функции создается для каждой функции (и мы тоже можем закрыться):

function iHaveScope() {
  // local function scope
  function iHaveNestedScope() {
    // nested local function scope
  }
}

Мы часто идентифицируем эти призывы как локальные области и определить объем верхнего уровня как глобальный объем. В среде браузера глобальный объем контролируется объектом окна в Node.js, он управляет глобальным объектом.

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

void function() {
  // your code here
}()

Блок-область – это то, что вы получаете, когда вы используете, если операторы, для заявлений и тому подобное. Вы также можете использовать их в одиночку с помощью простых начинающих фигурных брекетов {} , не путать с пустыми объектами литералами.

var a = {} // empty object literal

{ var a } // undefined object in a block scope

if (3 == '3') {
  // block scope for the if statement
}

for (var i=0; i<10; i++) {
  // block scope for the for statement
}

var vs. let.

Ключевое слово VAR ведет себя по-разному в функциональных областях и блокировку. Переменная объявлена с var В функциональном объеме не может быть доступен за пределами этой функции.

function iHaveScope() {
  var secret = 42;
}
secret; // ReferenceError: secret is not defined (in this scope)

Переменная, объявленная с VAR в области блока, доступна за пределами этой блоки.

for (var i=0; i<10; i++) {
  // block scope for the for statement
}
console.log(i) // => 10 (why oh why)

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

К счастью, у нас сейчас есть другой способ объявить переменные, используя Пусть Отказ Переменные, объявленные с помощью отпускания в рамках блока, доступны только внутри этого объема, что позволяет вам идеальное решение для задачи переменной индекса циклов. Если мы используем Пусть объявить Я Переменная в контуре A для цикла, эта переменная будет доступна только внутри цикла.

for (let i=0; i<10; i++) {
  // block scope for the for statement
}
console.log(i) // ReferenceError: i is not defined (D'oh!)

конститут

Объявление переменной с const точно так же, как Пусть Когда дело доходит до областей, но создает постоянную ссылку для переменной. Мы не можем изменить значение постоянной ссылки. Если мы поместим примитивное значение в постоянную, то значение будет защищено от изменения:

const PI = 3.141592653589793
PI = 42 // SyntaxError: "PI" is read-only

Обратите внимание, что если постоянная является объектом, мы все равно можем изменить свойства этого объекта, поэтому будьте осторожны в этом:

const dessert = { type: 'pie' };
dessert.type = 'pudding'; // Sure thing
console.log(dessert.type) // pudding

Однако мы не можем переназначить объект, объявленный с const:

const dessert = { type: 'pie' };
dessert = { type: 'cake' }; // SyntaxError: "dessert" is read-only

Если мы хотим совершенно неизменного объекта, нам придется использовать что-то еще. Моя любимая библиотека для этого Immutable.js Отказ

Константы широко используются при импорте вещей из других библиотек, чтобы они не изменялись случайно. В Node.js, например:

const _ = require('lodash');

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

Заключение

В общем, я думаю, это приятно всегда использовать Const Для ваших деклараций и только переключиться на Пусть или var Если вам действительно нужно. С Const , вы получаете душевное спокойствие, что никаких мутационных переназначений не происходит на переменной, а с Пусть / var Вам придется прочитать код, чтобы убедиться, что:

let answer = 42;
// some code ...
// answer MIGHT be 42 here, read the code to be sure.
// ***
// vs.
// ***
const answer = 42;
// some code ...
// answer IS STILL 42 here, no matter what happens above

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