未定义未捕获的ReferenceError函数

时间:2013-07-03 10:36:17

标签: javascript jquery scope

我有一个名为myVar的变量。单击复选框时,其值会更改。单击复选框后,您将看到一个警告框,其值显示为1.当您取消选中它时,它将再次显示一个值为0的警告框。这是正确的。

现在我有两个问题。

  1. 当我尝试通过点击Submit提交文档时,我收到错误Uncaught ReferenceError: confirm_submit is not defined。为什么呢?

  2. 当我将confirm_submit函数从ready event中删除时,我没有收到错误但在那种情况下,在confirm_submit函数内的第二个警告框显示{{ 1}} undefined。为什么? myVar功能无法访问myVar吗?

  3. 代码:

    confirm_submit

3 个答案:

答案 0 :(得分:3)

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

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

你期望在这里发生什么? myVar函数和myVar这个范围内的变量是一回事。如果声明一个变量然后声明一个具有相同名称的函数,该函数将替换堆栈中的变量。此外,JavaScript中没有块范围。函数中声明的所有内容都由编译器首先声明,而不管块是什么。所以......

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);
})(); 

答案 1 :(得分:2)

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

那只会工作一次。一旦输入函数myVar,您将用1或0替换它的值(函数是JS中的对象),它将不再是函数对象,而是数字。

答案 2 :(得分:0)

问题是......你的var和输入元素有相同的名称..

 document.myform.myVar.value = myVar;

所以要么将输入元素的id更改为其他变量,要么更改所有myVar名称

<input type="checkbox" name="myVar" id="inputId" value="myVar">Text here

 document.myform.inputId.value = myVar;