2012-11-19 144 views
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"); 
.... 

为什么?

回答

7

因为在Javascript中,其他函数中声明的函数是本地引用,并且在其父函数的范围之外不可见。因为你定义传递给$(document).ready匿名函数内部的功能updateSizeOptions

window.updateSizeOptions = updateSizeOptions; 
+0

啊..我明白了。因为jqgrid插件在制作网格时无法在全局范围内找到该函数。哦,伙计..它花了我一天! 非常感谢 –

0

:如果你想使你的updateSizeOptions功能全局访问,您将需要一个参考的全局命名空间分配给它,说window属性,updateSizeOptions只能在该匿名函数内部使用,除非您将其导出。 (即window.updateSizeOptions = updateSizeOptions

功能(和/或变量)在全球范围内定义下的window对象字面定义,所以如果你定义在全球范围内的功能,你做alert(window.updateSizeOptions)你会看到它显示了一个功能。 window.updateSizeOptions == updateSizeOptions将返回true

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

0

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

当你做javascript:updateSizeOptions();它会在全局范围内寻找一个在这种情况下不存在的函数,因此undefined