Область блока, область функции и локальная область в Javascript

  1. Is блок рамки иногда то же самое, что объем функция? Я знаю объем функция для всего внутри функции, но не получите, что именно блок рамки есть.
  2. для Javascript, это в настоящее время рекомендуется использовать let / const вместо var для дальнейшего обслуживания? (Это было от Руководство По Стилю Airbnb)

3 ответов


я не уверен, что вы действительно получили ответы на свои вопросы еще нет:

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

да, область блока иногда совпадает с областью функции. Область блока-это все внутри набора фигурных скобок { a block scope here }. Таким образом, в верхней части кода функции область блока будет такой же, как область действия функции:

function test(x) {
   // this is both a block scope and a function scope
   let y = 5;
   if (x) {
       // this is a smaller block scope that is not the same as the function scope
       let z = 1;
   }
}

для Javascript в настоящее время рекомендуется использовать let / const вместо var для будущего обслуживания? (Это было из руководства по стилю Airbnb)

let и const являются частью новейшей спецификации ES6 и реализованы только в последних движках Javascript, а иногда и в последних движках они включены только со специальными флагами. Они приходят ко всем новым JS-движкам / браузерам, но не широко еще не развернуты. Таким образом, если вы пишете Javascript для регулярного потребления браузером через широкий интернет, вы не можете надежно использовать let и const еще.

есть несколько случаев, когда вы можете безопасно программировать с let и const Теперь:

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

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

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

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


на Руководство По Стилю AirBnb вы связаны с специально написана для среды ES6 (обратите внимание, что существует отдельная ссылка для версии ES5 их руководства по стилю). Таким образом, это означает, что они предполагают среду, способную ES6. Это либо потому, что они нацелены на серверный движок JS, который, как они знают, поддерживает ES6, либо потому, что они используют транспилер, который преобразует код ES6 во что-то, что будет работать на движке ES5.


записку о transpilers. перед использованием транспилера и переключение всех объявлений переменных на let в пределах областей блоков стоит понять, какой код генерирует транспилер и влияет ли дополнительный код, который он генерирует, на производительность вашего приложения. Например, область блока для let моделируется путем создания встроенного IIFE, который может привести к дополнительным затратам времени выполнения для каждого блока, содержащего let заявление. Я не говорю, что это обязательно плохо, что должно помешать вам использовать транспилер, но при принятии решения об использовании транспилера я бы предложил вам тщательно ознакомиться с тем, как выглядит транспилированный код для различных функций ES6, чтобы вы знали, является ли это правильным инструментом для любой работы, которую вы имеете, или только для некоторых заданий.


  1. javascript 5 не использует заблокированную область, он использует цепную область. основное отличие заключается в том, что вы не можете получить доступ к переменной вне области, если вы не сделаете ее глобальной. ES 6 будет иметь заблокированную область при объявлении переменной с let.
  2. в настоящее время рекомендуется использовать var, потому что ES 6 не полностью поддерживается.

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

область блока-это все в стороне a блок, например:

function foo() {
    // function scope
    if (condition) {
        // block scope
    }
}

до версии 5th edition JavaScript не имел области блокировки. Следующая спецификация (ECMAScript 6, он же "ES6"), которая очень близка к завершению, добавляет область блока через let и const.

для Javascript в настоящее время рекомендуется использовать let / const вместо var для будущего обслуживания?

это зависит только от вас. let и const новые инструменты вы можете добавить к вашему поясу. Они не есть заменить var если вы не хотите, чтобы они. Тем не менее, вы слышите "let новая var" очень много.

переменные, объявленные с let имеют область блока, объявленные с var нет.

отметим, что let и const не имеют большой поддержки в дикой природе еще. Неудивительно, что добавление объема блока к движку, который никогда не имел его раньше, по-видимому, нетривиально. Вы можете использовать транспилер, как Babel, или просто продолжать использовать var сейчас.