在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
的匿名函数中定义了函数updateSizeOptions
, updateSizeOptions
只能在该匿名函数中使用,除非您将其导出。 (即window.updateSizeOptions = updateSizeOptions
)
在全局范围中定义的函数(或/和变量)实际上是在 window
对象下定义的,因此如果在全局范围内定义函数并进行alert(window.updateSizeOptions)
您将看到它显示一个函数。 window.updateSizeOptions == updateSizeOptions
将返回true
。
但是,如果您在本地范围内定义它,您将看到undefined
。
范围。 当你在$(document).ready
放入一些东西时,代码只会在触发此事件时被激活,并且事件内部声明的变量和函数之类的东西在事件之外不存在,除非全局设置。
当你做javascript:updateSizeOptions();
它将在全局范围内寻找一个函数,在这种情况下不存在,因此undefined
。