Scope что это
Перейти к содержимому

Scope что это

  • автор:

Область видимости. Основы

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

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

Если дать более техническое определение, то оно звучит так:

Область видимости переменных или просто “Область видимости” (англ. variable scope или просто scope) — это такая область программы, в пределах которой установлена связь между некоторой переменной и её идентификатором (именем), по которому можно получить значение этой переменной. За пределами области видимости тот же самый идентификатор может быть связан с другой переменной, либо быть свободным (вообще не связанным ни с какой из переменных).

Для понимания этой концепции можно привести следующую аналогию. Представим человека, которому была назначена деловая встреча в некотором бизнес-центре, где он раньше не был. Он заходит в нужный кабинет и так как там еще никого нет, он решает узнать время, для этого ему необходимы часы. Этот человек начинает искать часы, обнаруживает настольные часы и узнаёт по ним время.

В данной аналогии:

  • область видимости (scope) — это кабинет;
  • имя переменной, по которой происходит поиск нужного предмета, это “часы” (обозначим как clock);
  • в данной области видимости, с этим идентификатором (“часы”) ассоциируются настольные часы. Здесь стоит вспомнить, что переменные, это своего рода контейнеры (области памяти), для хранения необходимых значений. Именно настольные часы в рамках кабинета выступают неким контейнером для хранения времени.
  • значение этой переменной обозначим как “время на настольных часах”.

Поэтому, в данном кабинете переменная, которая представляет собой “настольные часы”, в JavaScript можно объявить как

let clock = "время на настольных часах"; 

схема области видимости

Теперь допустим, что человек в кабинете не нашел абсолютно никаких часов, другими словами в этой области видимости нет никаких переменных (ни настольных часов, ни каких-либо других), которые были бы связаны с идентификатором “часы” ( clock ). И в таком случае, в JavaScript запрос получения значения переменной с именем clock вызовет ошибку: Uncaught ReferenceError: clock is not defined . Которая сообщает о том, что в данной области видимости переменная, связанная с идентификатором clock , не определена.

схема области видимости

Разовьем аналогию дальше и представим, что хоть часов в кабинете и нет, этот человек знает, что в холле здания есть настенные часы. Он знает об этом, так как проходя в кабинет, отметил их наличие. И поэтому, он может получить нужное значение (время) из своего окружения — “выглянуть” из кабинета и посмотреть время на настенных часах.

В этой аналогии здание — это еще одна область видимости, которая также является окружением для области видимости “кабинет”. В данном здании идентификатор “часы” ( clock ) связан с переменной “настенные часы в холле”. И объявление этой переменной будет следующим:

let clock = "время на настенных часах в холле"; 

схема области видимости

Мы можем продолжить эту аналогию. Представим, что и в здании нет часов, но они есть на улице. Поэтому, даже находясь в кабинете, он может обратиться к своему окружению — выглянуть на улицу и посмотреть время на уличных часах.

схема области видимости

В JavaScript области видимости ограничиваются функциями (функциональная область видимости) или блоками инструкций (блочная область видимости).

Поэтому, пример с часами на JavaScript можно записать так:

function street()  //scope: street let clock = "время на уличных часах"; function building()  //scope: building function office()  //scope: office alert(clock); //покажет "время на уличных часах" > > > 

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

схема области видимости

function street()  //scope: street function building()  //scope: building alert(clock); // выполнение прервётся с ошибкой: Uncaught ReferenceError: clock is not defined function office()  //scope: office let clock = "время на настольных часах"; alert(clock); // покажет "время на настольных часах" > > > 

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

Глобальная область видимости — это та, у которой нет внешней области видимости (внешнего окружения). Она является отправной точкой нашей программы и самой внешней областью видимости для всех других, которые в неё вложены.

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

схема области видимости

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

Глобальная область видимости не вложена ни в какие другие области и находится вне всех функций, являясь родительской для всех других вложенных в неё областей видимости. И для объявления глобальной переменной clock наш код можно переписать так:

//global scope: window let clock = "время на часах, что доступны отовсюду"; function street()  //scope: street function building()  //scope: building function office()  //scope: office alert(clock); //покажет "время на часах, что доступны отовсюду" > > > 

В случае, если одна и та же переменная объявлена в нескольких вложенных областях видимости, её значение будет браться из текущей области видимости, где она запрашивается. Например:

//global scope: window let clock = "время на часах, что доступны отовсюду"; function street()  //scope: street alert(clock); //покажет "время на часах, что доступны отовсюду" function building()  //scope: building let clock = "время на настенных часах в холле"; alert(clock); //покажет "время на настенных часах в холле" function office()  //scope: office let clock = "время на настольные часах"; alert(clock); //покажет "время на настольные часах" > > > 

Несмотря на то, что переменная clock объявлена и глобально, и в функциях building и office , её значение будет браться из той области видимости, где оно непосредственно запрашивалось через alert(clock) .

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

Это называется “затенение переменных”, когда текущая переменная скрывает значение переменной объявленной в родительской области видимости. Вообще, чтобы избежать путаницы при командной разработке и неясности в том, в каких переменных что хранится, лучше не применять затенение и использовать разные имена переменных.

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

Дата изменения: February 26, 2023

Поделиться

Обнаружили ошибку или хотите добавить что-то своё в документацию? Отредактируйте эту страницу на GitHub!

Scope в управлении проектами

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

Что такое скоуп в управлении проектами?

Скоуп продукта включает описание фич, характеризующих продукт, результат или услугу. Обычно это составляющая продукта, вызывающая наибольший интерес конечного пользователя.

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

Почему скоуп в управлении проектами важен?

Скоуп четко описывает все элементы проекта. Он описывает правила, по которым что-то может быть добавлено или убрано по мере развития проекта. Скоуп помогает менеджеру проекта оценить время и затраты, которые потребует проект. Четкое информирование о скоупе проекта гарантирует то, что все заинтересованные стороны сошлись во мнениях о том, что необходимо сделать и как именно они это реализуют.

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

Процессы управления скоупом проекта

Ниже перечислим типичные процессы управления скоупом проекта:

Опишите, как вы будете создавать, валидировать и контролировать скоуп проекта. Чтобы создать его, можно использовать устав проекта (англ. Project Charter ) или план управления проектом (англ. Project Management Plan ). Следует организовать встречи, на которых предстоит определить процесс создания для утверждения скоупа, как команда будет участвовать в запросах на изменение (англ. Change Request ), и разногласиях об элементах скоупа, процедуре принятия результатов и иерархической структуре работ ( ИСР ) (англ. Work Breakdown Structure, WBS).

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

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

Определите скоуп вашего проекта в описании содержания проекта (англ. Project Scope Statement ). Описание содержания проекта отражает в деталях все, что включено в основные конечные результаты. Это включает в себя потребности проекта, зоны ответственности каждого члена команды и необходимые процедуры для завершения, верификации и согласования после завершения работы. В описании также поясняются ожидаемые результаты проекта.

Описание содержания проекта служит основой для совершения проектных решений с того момента, как все стейкхолдеры выразили свое с ним согласие. Перечислим некоторые пункты, которые должно содержать описание:

  • Описание скоупа продукта
  • Допущения проекта (англ. assumptions )
  • Результаты проекта
  • Проектные ограничения и исключения
  • Критерии приемки продукта
  1. Создание иерархической структуры работ

Иерархическая структура работ (ИСР) (англ. Work Breakdown Structure, WBS) — важный инструмент управления проектами. Он заключается в разделении всего проекта на отдельные задачи. Как только вы определили результаты проекта в описании содержания проекта, вы можете организовать их в небольшие элементы — «пакеты работ», тем самым упростив управление ими.

Рассмотрите и утвердите результаты проектов со стейкхолдерами. В случае возникновения разногласий можно сделать пересмотр в соответствии с обратной связью стейкхолдера.

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

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

Как определить описание содержания проекта

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

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

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

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

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

Описание содержания проекта должно содержать описание критериев, которые должны быть выполнены до приемки результатов поставки проекта. Критерии приемки могут указывать, например, необходимо ли тестирование для определения завершенности. Сроки приемки и согласование финансирования — еще одни критерии, которые стоят упоминания. Также можно указать, принимает ли организация финальные решения и может ли быть составлен акт выполненных работ.

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

Когда некоторые элементы не включены в проект и открыты к интерпретации, лучше исключить их полностью.

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

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

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

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

Пример: На этапе установки софта подрядчик предполагает, что конечные пользователи смогут участвовать в тестировании софта на протяжении проекта. Другое же предположение может быть таким, что даты отпусков руководителя и директора строго фиксированы.

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

Пример: Разработчик может нанять стороннего консультанта для участия в проекте.

Приглашаем всех желающих на открытое занятие «Оценка и тайминг», на котором обсудим:
— Кто такой менеджер проекта и как им стать
— Почему вотерфолл еще жив
— В чем ценность экспертной оценки
— Зачем нужны SMART и DoD
Регистрация доступна по ссылке.

  • управление проектами
  • scope
  • project management
  • тайминг
  • скоуп проекта

Введение в JavaScript scope

Введение в JavaScript scope (область видимости функции, область видимости блока).

JavaScript · 05.12.2019 · читать 3 мин �� · Автор: Alexey Myzgin

  • Область видимости или Scope
  • Глобальная область видимости или Global Scope
  • Локальная область видимости или Local Scope
  • Область видимости функции
  • Область видимости блока
  • Лексическая область видимости
  • Динамическая область видимости

Область видимости или Scope

Область видимости (scope) определяет видимость или доступность переменной (другого ресурса) в области твоего кода.

Глобальная область видимости или Global Scope

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

// Глобальная область var num = 5; console.log(num); // 5 function getNum() console.log(num); // num доступен здесь > getNum(); // 5

Локальная область видимости или Local Scope

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

// Глобальная область function foo1() // Локальная область 1 function foo2() // Локальная область 2 > > // Глобальная область function foo3() // Локальная область 3 > // Глобальная область

Локальная область видимости может быть разделена на область видимости функции и область видимости блока. Концепция область видимости блока или block scope была представлена в ECMAScript6 (ES6) вместе с новыми способами объявления переменных — const и let .

Область видимости функции

Всякий раз, когда мы объявляем переменную в функции, переменная видна только внутри функции. Мы не можем получить к ней доступ вне функции. var — это ключевое слово, определяющее переменную для доступности области функций.

function foo() var num = 10; console.log('inside function: ', num); > foo(); // inside function: 10 console.log(num); // ReferenceError: num is not defined

Область видимости блока

Область видимости блока — это область в условиях if и switch или циклов for , и while . Вообще говоря, всякий раз, когда мы видим фигурные скобки <> — это блок. В ES6 ключевые слова const и let позволяют разработчикам объявлять переменные в области видимости блока, что означает, что эти переменные существуют только в соответствующем блоке.

function foo() if (true)  var num1 = 5; // существуют в области видимости функции const num2 = 10; // существуют в области видимости блока let num3 = 23; // существуют в области видимости блока > console.log(num1); console.log(num2); console.log(num3); > foo(); // 5 // ReferenceError: num2 is not defined // ReferenceError: num3 is not defined

Лексическая область видимости

Ещё один момент, о котором стоит упомянуть — это лексическая область. Лексическая область означает, что дочерняя область имеет доступ к переменным, определенным в родительской области. Дочерние функции лексически связаны с контекстом исполнения их родителей.

function foo1() var num1 = 5; const num2 = 10; let num3 = 23; function foo2() console.log(num1); console.log(num2); console.log(num3); > foo2(); > foo1(); // 5 // 10 // 23

Динамическая область видимости

Лексическая область видимости — это набор правил о том, как и где движок JavaScript может найти переменную. Ключевой характеристикой лексического контекста является то, что он определяется во время написания кода (при условии, что мы не используем eval () или with ).

Динамическая область видимости, по понятным причинам, подразумевает, что существует модель, в которой область видимости может определяться динамически во время выполнения, а не статически во время создания. Например:

function foo() console.log(a); // 5 > function bar() var a = 10; foo(); > var a = 5; bar();

В лексической области видимости указывается, что ссылка на a в foo() будет преобразована в глобальную переменную a , что приведет к выводу значения 5 .

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

Таким образом, если бы JavaScript имел динамическую область видимости, то, когда выполняется foo() , теоретически приведенный ниже код, вместо 5 вернул бы 10 в качестве вывода.

function foo() console.log(a); // 10 ( не 5!) > function bar() var a = 10; foo(); > var a = 5; bar();

Как такое может быть?

Когда foo() не может найти ссылку на переменную для a , вместо просмотра вложенной (лексической) цепочки областей видимости, он идет вверх по стеку вызовов, чтобы найти, откуда вызывалась функция foo() . Поскольку foo() была вызвана из bar() , он проверяет переменные в области видимости bar() и находит там a со значением 10 .

Можно подумать что это странно.

Но JavaScript, на самом деле, не имеет динамической области видимости. Он имеет только лексическую область. А вот механизм this подобен динамической области видимости.

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

И наконец: this заботится о том, как была вызвана функция. Это показывает нам, насколько тесно механизм this связан с идеей динамической области видимости.

Атрибут scope

Атрибут scope связывает между собой ячейки с заголовком и обычные ячейки. По своему действию напоминает атрибут headers , но используется для простых таблиц. Атрибут предназначен для экранных ридеров вроде речевых браузеров, в обычных браузерах результат добавления scope никак не заметен.

Синтаксис

Значения

col Ячейка заголовка установлена для колонки. colgroup Ячейка заголовка установлена для группы колонок. row Ячейка заголовка задана для строки. rowgroup Ячейка заголовка установлена для группы строк.

Значение colgroup применяется в таблице, в которой используется тег или при объединении ячеек с помощью атрибута colspan . Значение rowgroup требуется при объединении ячеек через атрибут rowspan .

Значение по умолчанию

HTML 4.01 IE Cr Op Sa Fx

    Тег TD, атрибут scope   
Месяц Заработано
1 Январь 152
2 Февраль 176
3 Март 244

Не выкладывайте свой код напрямую в комментариях, он отображается некорректно. Воспользуйтесь сервисом cssdeck.com или jsfiddle.net, сохраните код и в комментариях дайте на него ссылку. Так и результат сразу увидят.

Типы тегов

HTML5

Блочные элементы

Строчные элементы

Универсальные элементы

Нестандартные теги

Осуждаемые теги

Видео

Документ

Звук

Изображения

Объекты

Скрипты

Списки

Ссылки

Таблицы

Текст

Форматирование

Формы

Фреймы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *