在document.ready中声明的函数是未定义的?

时间:2012-11-19 14:26:45

标签: jquery function jqgrid scope

如果我在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 个答案:

答案 0 :(得分:7)

因为在Javascript中,在其他函数中声明的函数是 local 引用,并且在其父函数的范围之外不可见。如果要使updateSizeOptions函数可全局访问,则需要在全局命名空间中为其指定引用,例如window属性:

window.updateSizeOptions = updateSizeOptions;

答案 1 :(得分:0)

因为您在传递给updateSizeOptions的匿名函数中定义了函数$(document).ready,所以updateSizeOptions只能在该匿名函数中使用,除非您将其导出。 (即window.updateSizeOptions = updateSizeOptions

全局范围中定义的函数(或/和变量)在<{em> window对象下字面定义,因此如果在全局范围内定义函数,则执行{{1你会看到它显示一个函数。 alert(window.updateSizeOptions)将返回window.updateSizeOptions == updateSizeOptions

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

答案 2 :(得分:0)

范围。当您在$(document).ready中放置某些内容时,只有在触发此事件时才会执行代码,并且除非事件全局设置,否则事件内部声明的变量和函数之类的内容不存在。

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