Когда и где мы должны использовать подъем в Javascript [закрыто]

11

Я новичок в Javascript. Я изучаю концепцию подъема в Javascript.
Основываясь на руководствах по Javacsript на сайте Mozilla , я наткнулся на это слово hoisting. Согласно этим учебникам, переменные в JavaScript - это то, что вы можете ссылаться на переменную, объявленную позже, без получения исключения . Но мой вопрос заключается в том, при каких обстоятельствах целесообразно использовать подъем в клиентском Javascript или почему мы должны использовать подъем в Javascript. Каковы его преимущества.

Рудра
источник
1
Обмен вашими исследованиями помогает всем. Расскажите нам, что вы пробовали и почему это не соответствует вашим потребностям. Это свидетельствует о том, что вы потратили время, чтобы попытаться помочь себе, избавляет нас от повторения очевидных ответов и, прежде всего, помогает получить более конкретный и актуальный ответ. Также см. Как спросить
Гнат
6
@gnat После всего исследования, если бы я поняла эту тему, зачем я разместила этот вопрос здесь, чтобы правильно обсудить и понять концепцию
Rudra
2
@Rudra Это не дискуссионный форум. Более того, вы не показали никаких доказательств того, что вы действительно это исследовали.
Доваль
5
Да, но это не обязательно задавать вопросы.
Роберт Харви
2
@Rudra: Имейте в виду, что мы не дискуссионный форум. Мы на самом деле сайт Q & A. Задаваемые здесь вопросы должны иметь разумную ответственность в формате вопросов и ответов.
Роберт Харви

Ответы:

11

Я никогда не слышал термин "подъем". Если вы ссылаетесь на это использование подъема Беном Черри: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html , то, насколько я могу судить, он просто повторяет Дугласа Крокфорда из Javascript: Хорошие части , и говорят, что вы никогда не должны использовать подъем . В конце он утверждает, что все переменные должны быть объявлены в верхней части вашей функции (как предлагают Крокфорд и JSLint).

Или, по словам г-на ChristopherBrown, это, по-видимому, не функция, которую нужно использовать , а просто изюминка, связанная с тем, как браузер интерпретирует Javascript.

Итак, вкратце: никогда и никуда .

Дэвид Кауден
источник
1
Тогда, почему эта концепция включена и о чем эта особенность?
Рудра
@Rudra: подтема «Объявления, имена и подъём» в статье, на которую ссылается Дэвид, похоже, достаточно хорошо освещает это. Какая часть неясна?
Роберт Харви
@RobertHarvey Я просто хочу знать, где и когда они это используют. Дэвид говорит, что он никогда и нигде не используется, но почему это показано как особенность
Рудра
4
То, что что-то является функцией, не означает, что это хорошая идея. Есть много причин, по которым «особенности» теряют популярность. Даже ваше приложение не имеет явно полезной цели, хотя, вероятно, это было в дни пещерного человека.
Роберт Харви
1
HOisting - это термин из теории компилятора, особенно оптимизации. Он существует уже не менее 20 лет, но стал популярным благодаря этой особенности Javascript. Если бы это не называлось функцией, это, вероятно, было бы ошибкой.
david.pfx
16

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

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

function AddTwoAndTwo() {
    var two = 2;
    var result = two + two;
    return result;
}

В опубликованном коде обе переменные «two» и «result» существуют в начале области действия функции (очевидно, так как они там объявлены). Однако, поскольку браузеры «поднимают» переменные, следующее становится допустимым кодом Javascript ,

function AddTwoAndTwo() {
    result = 5;
    alert(result);
    var two = 2;
    var result = two + two;
    return result;
}

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

var result = 6;

function AddTwoAndTwo() {
    alert(result);  // should this be 6 or undefined?
    var two = 2;
    var result = two + two;
    return result;
}

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

ChristopherBrown
источник
4
+1: вот как бы я ответил. Это не функция, которую нужно использовать или не использовать, это просто свойство среды, которую необходимо учитывать.
scrwtp
1

Почему?

У JavaScript нет Block Scope , это должно объяснить, почему все должно подниматься наверх.

Это полезно?

Если вы предпочитаете это:

var someVariable = someVariable || {};

Вместо этого:

if ( "undefined" !== typeof someVariable ) {
    someVariable = someVariable;
} else {
    someVariable = {};
}

Тогда это полезно. Даже если вы этого не замечаете!

Clearification

Первый пример переведет что-то вроде этого:

var someVariable = someVariableValue;

if ( "undefined" !== typeof someVariable ) {
    var someVariableValue = someVariable;
} else {
    var someVariableValue = {};
}
мессия
источник