3

如果我在 document.ready 中声明一个函数,我会得到一个错误。像这样

$(document).ready(function(){
    function updateSizeOptions()
    {
        alert("updateSizeOptions");
    }

    var jGrid = $("#list_main");
    jGrid.jqGrid({
        url:'db.php?ajaxOp=getData',
            colModel:[
                $.extend(true,
                { name:'shape_id'
                  ,index:'shape_id'
                  ,edittype:'select'
                  ,formatter:'select'
                  ,editoptions: { onclick:"javascript:updateSizeOptions();" }
                }
                ,{}
            ]
        ....
});

它会给出错误:“ReferenceError: updateSizeOptions is not defined”。
但如果我将函数移到 document.ready 之外,一切正常。
像这样

function updateSizeOptions()
{
    console.debug("updateSizeOptions");
}

$(document).ready(function(){
    var jGrid = $("#list_main");
....

为什么 ?

4

3 回答 3

7

因为在 Javascript 中,在其他函数中声明的函数是本地引用,并且在其父函数范围之外是不可见的。如果你想让你的updateSizeOptions函数全局可访问,你需要在全局命名空间中为它分配一个引用,比如一个window属性:

window.updateSizeOptions = updateSizeOptions;
于 2012-11-19T14:29:52.660 回答
0

因为您在updateSizeOptions传递给的匿名函数中定义了该函数,所以除非您将其导出$(document).readyupdateSizeOptions否则它将仅在该匿名函数中可用。(即window.updateSizeOptions = updateSizeOptions

在全局范围内定义的函数(或/和变量)实际上是在对象下定义的window所以如果你在全局范围内定义函数并且你这样做了,alert(window.updateSizeOptions)你会看到它显示了一个函数。window.updateSizeOptions == updateSizeOptions将返回true

但是,如果您在本地范围内定义它,您将看到undefined.

于 2012-11-19T14:33:29.903 回答
0

范围。当你在里面放一些东西$(document).ready时,代码只会在触发这个事件时执行,并且在事件内部声明的变量和函数等东西不存在于事件之外,除非全局设置。

当您这样做javascript:updateSizeOptions();时,它将在全局范围内查找在这种情况下不存在的函数,因此undefined.

于 2012-11-19T14:34:27.403 回答