0

Почему переменная не видна за пределами функции?

Например:

$(document).ready(function(){
    test_ = $(window).width();
});
console.log(test_);

И можно ли ее получить вне функции?

2 Answers2

3

В уточнение к @Stalker. $(document).ready(function(){}) срабатывает только когда DOM отрисован, а console.log(test_); сразу как скрипт подгрузился.

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

В твоем случае так:

$(document).ready(function(){
    let test_ = $(window).width();
    console.log(test_);
});
  • 2
    записывайте в переменную глобальной области видимости window. $(document).ready(function(){ window.test_ = $(window).width(); }); – EVG Feb 05 '19 at 14:50
  • @EVG дельное предложение. Можно и так, все зависит от задачи. – Максим Н Епихин Feb 05 '19 at 16:19
1

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

Чтобы получить значение вне функции нужно переменную test_ объявить в самом начале, например так:

var test_;
$(document).ready(function(){
test_ = $(window).width();
});
console.log(test_);
Stalker
  • 533
  • 1
    И этот код, и код в вопросе выведут одно и то же - undefined. – Yaant Feb 05 '19 at 14:47
  • @Yaant, it depends :) – Grundy Feb 05 '19 at 14:48
  • @Grundy, а в каком случае будет что-то иное (если не предполагать, что test_ присваивается какое-то значение где-то ещё в непоказанном нам коде)? – Yaant Feb 05 '19 at 14:52
  • @Yaant, если событие DOMContentLoaded уже произошло, то коллбэк переданный в ready выполнится сразу. – Grundy Feb 05 '19 at 14:55
  • @Grundy Хм, вообще сразу, а не на ближайшем тике event loop'а? Не знал, имхо, это несколько контринтуитивно, если так. – Yaant Feb 05 '19 at 15:01
  • Я в самом деле ответил неточно, предполагая, что console.log(test_); вводится в консоли или вызывается где-то дальше в коде, который вызывается уже после полной загрузки документа. @mepihindeveloper, спасибо за уточнение – Stalker Feb 05 '19 at 18:39
  • @Yaant, вообще, всегда казалось что да, но сейчас пересмотрел исходники там на их реализации Promise сделано – Grundy Feb 06 '19 at 06:17