文档就绪函数内声明的函数未定义?

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未定义"。
但是,如果我将该函数移到document.ready之外,一切都正常。
像这样:
function updateSizeOptions()
{
    console.debug("updateSizeOptions");
}

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

为什么?
3个回答

9
因为在 Javascript 中,嵌套函数声明是局部引用,在其父函数的作用域之外不可见。如果您希望使您的 updateSizeOptions 函数全局可访问,您需要将其引用分配到全局命名空间中,例如一个 window 属性:
window.updateSizeOptions = updateSizeOptions;

啊..我明白了。因为jqgrid插件在创建表格时无法在全局范围内找到该函数。哦天啊..这让我浪费了一整天!非常感谢。 - Hendry H.

0
因为您在传递给$(document).ready的匿名函数中定义了updateSizeOptions函数,所以除非导出它,否则updateSizeOptions函数只能在该匿名函数内部使用。(即window.updateSizeOptions = updateSizeOptions)。
在全局范围内定义的函数(或/和变量)实际上是在window对象下定义的,因此如果您在全局范围内定义函数并执行alert(window.updateSizeOptions),您将看到它显示一个函数。window.updateSizeOptions == updateSizeOptions将返回true
但是,如果您将其定义在本地作用域中,则会看到undefined

0

作用域。当您将某些内容放在$(document).ready内部时,只有在触发此事件时才会执行代码,而在事件内声明的变量和函数等内容在事件外部不存在,除非全局设置。

当您执行javascript:updateSizeOptions();时,它将在全局范围内查找一个函数,在这种情况下该函数不存在,因此为undefined


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接