【问题标题】:Variable not defined even being globally defined即使是全局定义的变量也没有定义
【发布时间】:2014-05-24 00:41:07
【问题描述】:

所以我有这个功能,我在全局声明 var togglesmall,我得到“Uncaught ReferenceError: togglesmall is not defined”

$(document).ready(function(){
if ( !$('.sound,.sound-small').hasClass('clickd') || $('.sound').hasClass('gone') ){

$('body').on('mouseleave', function(){
togglesmall = setTimeout(function(){$('.sound-small').fadeOut()}, 2000);
});

$('body').on('mouseenter', function(){
clearTimeout(togglesmall);
$('.sound-small').fadeIn(500);
});
};

$('.sound').on('click', function(){
$('.sound').fadeOut(1000);
$('.sound').addClass('clickd');
});
});

这不是我第一次收到它,但我不知道为什么会这样。

我正在学习 js,所以我是个新手。整个代码都是我写的,如果你有任何建议,我很感激。

【问题讨论】:

  • togglesmall 是初始化为一个值还是仅声明?你能在你做这个声明的地方包含代码吗?
  • 如果要使用全局变量,请使用window.togglesmall。不鼓励使用 togglesmall 而不声明,并且在严格模式下无效。
  • 我确定在您的代码中看不到该变量的任何明确定义。如果您依赖于隐式声明,它只会发生在mouseleave 上,这通常会发生在之后 mouseenter,它会读取该变量。所以当mouseenter首先发生时,隐式声明还没有发生,你会得到错误。
  • 我不是在第5行声明了吗? togglesmall = setTimeout... 我尝试使用 window.togglesmall 而不是 togglesmall,但我得到了同样的错误。
  • 即使是全局定义的这不是真的,你没有全局定义它。

标签: javascript jquery css


【解决方案1】:

你应该像这样在顶部声明 togglesmall:

var togglesmall = null;

否则,变量的范围就会变得不明确。

【讨论】:

  • 声明一个变量而不直接存储值是通过var togglesmall;
  • 这将被初始化为不安全的未定义。在 Javascript 中,使用默认值初始化变量是一个好习惯。
  • null 并不比undefined 安全。尤其是在这种情况下,使用 undefined 代替是没有问题的:clearTimeout(undefined)clearTimeout(null) 一样有效。
【解决方案2】:

要使变量全局定义,您需要在文档准备好时创建它。所以一定是这样的

$(document).ready(function(){
    var togglesmall;
    ........
    // continue your code below
});

【讨论】:

  • 声明一个变量而不直接存储值是通过var togglesmall;
【解决方案3】:

你收到了ReferenceError,因为

togglesmall = setTimeout(...)

正在执行global assignment,它仅在此代码运行之后创建该变量。

做类似的事情:

if (typeof togglesmall != 'undefined')
  clearTimeout(togglesmall)

将修复您的ReferenceError

或者,正如 David W Lee 建议的那样:

$(document).ready(function(){
var togglesmall;  // add this; defines the variable and initializes to undefined

有趣的事实:像你正在做的那样做全局分配

previousUndeclaredName = value;

没有遇到类似的事情

var previousUndeclaredName;

或在参数列表中

function doSomething(previousUndeclaredName) {

始终在严格模式下为ReferenceError。[1]

[1]https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#Description

【讨论】:

    【解决方案4】:

    您需要在文档准备好时创建它。如下...

    $(document).ready(function(){
        var togglesmall;
        //yourode
    });
    

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 2020-03-25
      相关资源
      最近更新 更多