2016-11-08 3 views
-1

Я только что сдался, попытался найти решение на целый день. Помогите мне понять эту вещь. Почему глобальная переменная не обновляется?Обновить глобальную переменную с помощью jQuery.tabs

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

var last; 
jQuery('#tabs').tabs({ 
    active: 0, 
    activate: function(event, ui) { 
    if (ui.newPanel.is("#tabs-1")) { 
     var last = 24; 
     console.log(last) 
    } else if (ui.newPanel.is("#tabs-2")) { 
     var last = 48; 
    } else if (ui.newPanel.is("#tabs-3")) { 
     var last = 72; 
    }; 

    } 
}); 

console.log(last); 

Что я могу здесь пропустить?

+0

Кроме 'last' быть локальными по отношению к' activate' функции, подумайте о том, когда какая функция выполняется. Вызов 'console.log (last)' в конце примера выполняется одновременно с 'jQuery ('# tabs'). Tabs (...)' выполняется, то есть * один раз * при загрузке страницы. Функция «активировать» вызывается * позже *, * после загрузки страницы *, всякий раз, когда нажимается вкладка. –

ответ

1

объявив var является функция области видимости. См. What is the scope of variables in JavaScript?

У вас есть var last, указанный в верхней части вашей страницы, который является глобальным охватом.

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

Ваш console.log(last) относится к глобальному last, который вы никогда не придадите значения.

Если вы хотите использовать глобальный last, удалите декларацию из своей функции. Затем компилятор не найдет локальную функцию var last и отправится к внешней области, где найдет ваш глобальный last, который он будет использовать.

var last; // global scope 
jQuery('#tabs').tabs({ 
    active: 0, 
    activate: function (event, ui) { 
    if (ui.newPanel.is("#tabs-1")) { 
     last = 24; // remove var declaration to use global variable 
     console.log(last); 
    } 

    else if (ui.newPanel.is("#tabs-2")) { 
     last = 48; 
    } 

    else if (ui.newPanel.is("#tabs-3")) { 
     last = 72; 
    }; 

    } 
}); 

console.log(last); // global scope last 

var last = -1; // global scope 
 
var whereAmI = "GLOBAL SCOPE"; 
 

 
$('button').on('click',function() { // new scope within function 
 
    if (new Date().getMilliseconds() % 2 === 0) { 
 
     var whereAmI = "FUNCTION SCOPE"; 
 
     var last = 24; 
 
     console.log(last); 
 
     console.log(whereAmI); 
 
    } else { 
 
     last = 48; 
 
     whereAmI = "FUNCTION SCOPE"; 
 
     console.log(last); 
 
     console.log(whereAmI); 
 
    } 
 
}); 
 

 
console.log(last); // global scope 
 
console.log(whereAmI); // global scope
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button>Click Me!</button>

0

Использование var в activate обработчика делает его локальным переменным, таким образом, она не обновляет внешний объем переменной

var last; 
 
jQuery('#tabs').tabs({ 
 
    active: 0, 
 
    activate: function(event, ui) { 
 
    if (ui.newPanel.is("#tabs-1")) { 
 
     last = 24; 
 
     console.log(last) 
 
    } else if (ui.newPanel.is("#tabs-2")) { 
 
     last = 48; 
 
    } else if (ui.newPanel.is("#tabs-3")) { 
 
     last = 72; 
 
    }; 
 

 
    } 
 
}); 
 

 
$('button').click(function() { 
 
    $('#inputlast').val(last); 
 
})
<link href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet" /> 
 
<script src="https://code.jquery.com/jquery-3.1.0.js"></script> 
 
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 
 
<div id="tabs"> 
 
    <ul> 
 
    <li><a href="#tabs-1">Nunc tincidunt</a> 
 
    </li> 
 
    <li><a href="#tabs-2">Proin dolor</a> 
 
    </li> 
 
    <li><a href="#tabs-3">Aenean lacinia</a> 
 
    </li> 
 
    </ul> 
 
    <div id="tabs-1"> 
 
    <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper 
 
     leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. 
 
     Nunc tristique tempus lectus.</p> 
 
    </div> 
 
    <div id="tabs-2"> 
 
    <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean 
 
     aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. 
 
     Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.</p> 
 
    </div> 
 
    <div id="tabs-3"> 
 
    <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia 
 
     nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.</p> 
 
    <p>Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna 
 
     ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. 
 
     Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.</p> 
 
    </div> 
 
</div> 
 

 
<br /> 
 
<input id="inputlast" readonly /> 
 
<button>Value</button>

Смежные вопросы