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

如果我在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"); .... 

为什么?

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

 window.updateSizeOptions = updateSizeOptions; 

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

在全局范围中定义的函数(或/和变量)实际上是 window对象定义的,因此如果在全局范围内定义函数并进行alert(window.updateSizeOptions)您将看到它显示一个函数。 window.updateSizeOptions == updateSizeOptions将返回true

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

范围。 当你在$(document).ready放入一些东西时,代码只会在触发此事件时被激活,并且事件内部声明的变量和函数之类的东西在事件之外不存在,除非全局设置。

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