Javascript 即使是全局定义的变量也未定义

Javascript 即使是全局定义的变量也未定义,javascript,jquery,css,Javascript,Jquery,Css,所以我有这个函数,我在全局声明变量togglesmall,得到“uncaughtreferenceerror:togglesmall未定义” 这不是我第一次收到它,但我永远不知道它为什么会发生 我正在学习js,所以我是个新手。整个代码都是我写的,因此如果您有任何建议,我非常感谢。您应该在顶部声明togglesmall,如下所示: var togglesmall = null; 否则,变量的范围将变得不明确。您将得到一个引用错误,因为 togglesmall = setTimeout(...)

所以我有这个函数,我在全局声明变量togglesmall,得到“uncaughtreferenceerror:togglesmall未定义”

这不是我第一次收到它,但我永远不知道它为什么会发生


我正在学习js,所以我是个新手。整个代码都是我写的,因此如果您有任何建议,我非常感谢。

您应该在顶部声明togglesmall,如下所示:

var togglesmall = null;

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

您将得到一个
引用错误
,因为

togglesmall = setTimeout(...)
正在执行的操作仅在运行此代码后创建变量

做一些类似于:

if (typeof togglesmall != 'undefined')
  clearTimeout(togglesmall)
将修复您的
引用错误

或者,正如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]

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

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

您需要在文档准备就绪时创建它。就像下面

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

togglesmall是初始化为值还是仅声明?是否可以包含执行此声明的代码?如果要使用全局变量,请使用
window.togglesmall
。不建议使用不带声明的
togglesmall
,在严格模式下是无效的。我肯定在代码中看不到该变量的任何显式定义。如果您依赖隐式声明,则它仅发生在
mouseleave
上,这通常发生在读取该变量的
mouseenter
之后。所以当
mouseenter
首先发生时,隐式声明还没有发生,您得到了错误。我不是在第5行声明了吗?togglesmall=设置超时。。。我试图将window.togglesmall替换为togglesmall,但我得到了相同的错误。即使是全局定义的,这也不是真的,您也没有全局定义它。通过
var togglesmall;声明变量而不直接存储值将被初始化为未定义,这是不安全的。在Javascript中,最好使用默认值初始化变量。
null
并不比
undefined
更安全。特别是在这种情况下,让
未定义
取而代之是没有问题的:
clearTimeout(未定义)
clearTimeout(null)
一样有效。声明变量而不直接存储值是通过
var togglesmall
$(document).ready(function(){
    var togglesmall;
    //yourode
});