Javascript 在console.log中更新变量,但不在其他函数中更新

Javascript 在console.log中更新变量,但不在其他函数中更新,javascript,jquery,Javascript,Jquery,我想不出我做错了什么 Im使用jquery更新屏幕上的变量调整大小。变量的用途是修复CSS点击媒体查询768px时scrollTop函数的超调 以下是我为resize函数编写的代码: $(window).resize(function(){ if (window.matchMedia('(max-width: 768px)').matches) { var scrollovershoot = 40;console.log(scrollovershoot); } else {

我想不出我做错了什么

Im使用jquery更新屏幕上的变量调整大小。变量的用途是修复CSS点击媒体查询768px时
scrollTop
函数的超调

以下是我为resize函数编写的代码:

$(window).resize(function(){
  if (window.matchMedia('(max-width: 768px)').matches) {
    var scrollovershoot = 40;console.log(scrollovershoot);
  } else {
   var scrollovershoot = 0;console.log(scrollovershoot);
  }
});
$(".fixed-navigation-follow li a, .see-next a, .more-info-cta, .flipper-container a, #main-atf-cta").click(function (){
    var scrollmeto = $(this).attr("href");
 $('html, body').animate({
       scrollTop: $(scrollmeto).offset().top - scrollovershoot
 }, 1000);
    return false;
});
现在,当屏幕大小达到768或以下(即值40)时,上面的函数会记录正确的
scrollovershoot
变量,这与它应该的工作方式完全相同。不过,在我的另一个
scrollTop
函数中,变量似乎没有更新(它没有更新
scrollTop
偏移量)。以下是滚动功能的代码:

$(window).resize(function(){
  if (window.matchMedia('(max-width: 768px)').matches) {
    var scrollovershoot = 40;console.log(scrollovershoot);
  } else {
   var scrollovershoot = 0;console.log(scrollovershoot);
  }
});
$(".fixed-navigation-follow li a, .see-next a, .more-info-cta, .flipper-container a, #main-atf-cta").click(function (){
    var scrollmeto = $(this).attr("href");
 $('html, body').animate({
       scrollTop: $(scrollmeto).offset().top - scrollovershoot
 }, 1000);
    return false;
});

当我调整屏幕大小时,我会从我的第一个函数中获得自动控制台日志,显示正确的值,但是当我停止调整屏幕大小时,只需键入
console.log(scrollovershoot)在控制台中,我得到
scrollovershoot
未定义消息。这是为什么?

scrollovershoot
需要是一个全局变量。您正在功能级别定义它

更改关键字时,请删除关键字
var
,以防止在函数范围内定义它,并在代码段上方定义它,使其成为全局关键字

或者,为了更安全,您可以通过将其指定给全局对象
窗口
,使其成为全局对象

window.scrollovershoot = 0;
$(window).resize(function(){
    if (window.matchMedia('(max-width: 768px)').matches) {
      window.scrollovershoot = 40;console.log(window.scrollovershoot);
    } else {
      window.scrollovershoot = 0;console.log(window.scrollovershoot);
    }
});
在jQuery中:

$(".fixed-navigation-follow li a, .see-next a, .more-info-cta, .flipper-container a, #main-atf-cta").click(function (){
    var scrollmeto = $(this).attr("href");
 $('html, body').animate({
       scrollTop: $(scrollmeto).offset().top - window.scrollovershoot
 }, 1000);
    return false;
});
当您使用
var
时,您正在函数范围内定义一个变量。在函数之前定义它,使它成为全局的,其他函数可以访问它

// In the browser, `window` is a global object referring to the browser object module.
// More info: http://www.w3schools.com/js/js_window.asp.

var myGlobalVar;
function f() {
    myGlobalVar = 'something';
    window.myVar = 'something else';
    var myLocalVar = 'some other things';
}
function g() {
    console.log(myGlobalVar); // this works
    console.log(window.myVar); // this also works
    console.log(myLocalVar); // this does NOT work
}

f();
g();

我在控制台上测试了你的修复程序,它似乎仍然有效overshoot@DannyDyer你能做一把小提琴或是一把木棍吗?也许上面的代码片段仍然在函数中。在这种情况下,不要使用
scrollovershoot
,而是尝试
window.scrollovershoot
。让我知道这是否解决了您的问题,所以我更新了答案。但实际上,它不需要在function@DannyDyer在实际项目中,在任何地方使用
window.scrollovershoot
而不是
scrollovershoot
,看看它是否有什么不同。不需要定义它。您是指只有这一行:“scrollTop:$(scrollmeto).offset().top-window.ScrollOvershot”还是它出现的任何地方?