Это первоначально опубликовано автором на его Блог Отказ Этот пост был отредактирован для ясности, а некоторые детали могут появиться отличаться от исходного поста.
Следующая строка действительная строка 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
Не совсем не обеспечивает полную неподумность для всех объектов, это очень хорошее начало примитивных ценностей.