javascript - 未捕获的 ReferenceError 函数未定义

标签 javascript jquery scope

我有一个名为 myVar 的变量。当您单击该复选框时,其值会发生变化。单击该复选框时,您将看到一个警报框,其值为 1。当您取消选择它时,它将再次显示一个值为 0 的警报框。这是正确的。

现在我有 2 个问题。

  1. 当我尝试通过单击“提交”来提交文档时,我收到一条错误:Uncaught ReferenceError:confirm_submit 未定义。为什么?

  2. 当我将 confirm_submit 函数置于 ready 事件 之外时,我没有收到错误,但在这种情况下,内部的第二个警报框inform_submit 函数显示 myVarundefined。为什么? myVar 是否无法在 confirm_submit 函数中访问?

代码:

<html>
<head>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.treeTable.js"></script>
<script type="text/javascript">
var myVar;
jQuery(document).ready(function() {
    $("#myTable2").treeTable({
        expandable: true,
        clickableNodeNames: true,
        initialState: "expanded",
    });
    document.getElementById('myVar').addEventListener('click', myVar, false);

    function myVar() {
        if (document.getElementById('myVar').checked === true) {
            myVar = 1;
        } else {
            myVar = 0;
        }
        alert(myVar);
    }.................
    some functions....................

    function confirm_submit() {
        alert(myVar);
        if (confirm('Press OK to confirm')) {
            document.myform.myVar.value = myVar;
            document.myform.submit();
            reload_parent_and_close_window();
        }
    }
    and some more functions.....................
});
</script>   
</head>
<body>
   <form name="myform" id="myform" action="$action" method="post" onsubmit="return false;">
     <input type="checkbox" name="myVar" id="myVar" value="myVar">Text here
  </form>
  <a href="javascript:confirm_submit()">Submit</a>
</body>
</html>

最佳答案

您似乎未能掌握一些基本概念,一些 JavaScript 和一些编程基础知识。

function myVar() {
    ...
    alert(myVar);
}

您预计这里会发生什么? myVar 函数和 myVar 在此范围内的变量是同一件事。如果声明一个变量,然后声明一个同名的函数,该函数将替换堆栈中的变量。另外,JavaScript 中没有 block 作用域。函数中声明的所有内容都首先由编译器声明,无论 block 如何。所以...

function a() {
    var a = 1;
    if (1) {
        var b = 4;
        alert(b);
    }
    alert(b);
}

不要假设作用域与 Java 或 C++ 相同。

另外,如果你想让某些东西显式地全局化,那么就让它显式化。尝试将 myVar 函数重命名为诸如“onClick_myVar”之类的合理名称。然后在声明函数之前,将函数放入闭包中并声明状态变量:

(function() { // Closure
    var myVar;

    function onClick_myVar() {
        if ($(this).getattr("checked")) {
            myVar = 1;
        } else {
            myVar = 0;
        }
        alert(myVar);
    }

    $('#myVar').click(onClick_myVar);
})(); 

关于javascript - 未捕获的 ReferenceError 函数未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17445771/

相关文章:

c - 使用 typedef 和结构时出错

javascript - 从 Node.JS 向 DocuSign 发送请求时强制设置 TLS 版本 1.2

javascript - 使用ajax获取选项后将值设置为下拉列表

php - 在透明圆圈上渲染图像并裁剪它

javascript - 完全禁用 Jquery UI 小部件

c - 头文件中的静态存储类

JavaScript 词法作用域和变量的生命周期

javascript - Famo.us Scrollview + TouchSync - 使 ScrollView/TouchSync 意识到旋转 Z 变换

javascript - 实时更新内容/jquery 的动画高度

javascript - 使用 jQuery 禁用无效