Javascript作用域问题

Javascript作用域问题,javascript,jquery,scoping,Javascript,Jquery,Scoping,我正在尝试构建一个通用的ajax加载程序,而ajax正在运行一个lightbox,其中将显示动画“加载”gif 我对范围界定有一些问题 代码是: var t=setTimeout( "s.d.dialog( 'destroy' )" ,(s.o.msgTime*1000)); 错误为:“未捕获引用错误:未定义” ;(函数($){ $.loader=函数(数据、选项){ 返回$.loader.impl.init(数据、选项); }; $.loader.close=函数(数据){ $.loader

我正在尝试构建一个通用的ajax加载程序,而ajax正在运行一个lightbox,其中将显示动画“加载”gif

我对范围界定有一些问题

代码是:

var t=setTimeout( "s.d.dialog( 'destroy' )" ,(s.o.msgTime*1000));
错误为:
“未捕获引用错误:未定义”

;(函数($){
$.loader=函数(数据、选项){
返回$.loader.impl.init(数据、选项);
};
$.loader.close=函数(数据){
$.loader.impl.close(数据);
};
$.loader.create=函数(){
$.loader.impl.create();
};
$.loader.defaults={
附于:'正文',
自动创建:对,
msg时间:5,,
};
$.loader.impl={
d:{},
init:函数(数据、选项){
var s=此;
s、 o=$.extend({},$.loader.defaults,options);
if((typeof data=='object')&&&!(jQuery的数据实例)&&data.url){
data.success=函数(data,textStatus,jqXHR){$.loader.close();}
data.error=function(jqXHR,textStatus,errorshown){$.loader.close('error accessing server');}
$.ajax(数据);
}否则如果(s.o.autoCreate){
s、 创建();
}
返回s;
},
创建:函数(){
var s=此;
s、 d=$('').appendTo(s.o.appendTo);
s、 dialog({title:'Loading…',dialogClass:'noTitleStuff',model:true,draggable:false,resizeable:false});
},
关闭:功能(数据)
{
var s=此;
//警报(s.d.类型);
if((数据类型=='string')&&data){
$(“#加载_diag”).hide();
$(“#dialog”).html(数据);
var t=setTimeout(“s.d.dialog('destroy')”,(s.o.msgTime*1000));
}否则{
s、 d.对话(“销毁”);
}
s、 d={};
},
};
})(jQuery);
如果有人知道如何解决,请分享

第一个和第二个解决方案做了一些事情,但尚未完全修复,
现在我得到了一个不同的错误:“uncaughttypeerror:Object#没有方法'dialog'$.loader.impl.close.s.d”

这将使它工作:

var t = setTimeout(function() { s.d.dialog('destroy'); }, s.o.msgTime * 1000);

当您将一个字符串传递到
setTimout
中时,该字符串(code)将在全局代码中执行-并且由于
s
是一个局部变量,因此它实际上没有在全局代码中定义。

这将使其工作:

var t = setTimeout(function() { s.d.dialog('destroy'); }, s.o.msgTime * 1000);

当您将一个字符串传递到
setTimout
中时,该字符串(code)将在全局代码中执行,并且由于
s
是一个局部变量,因此它实际上没有在全局代码中定义。

当您将一个字符串传递到setTimeout时,该字符串中的代码将在
窗口
对象的上下文中执行。由于
window.s
不存在,因此会出现错误。您可以将闭包传递给setTimeout,以使s变量保持在作用域中,如下所示:

var t = setTimeout(function() {s.d.dialog('destroy'); }, s.o.msgTime * 1000);

将字符串传递给setTimeout时,字符串中的代码将在
窗口
对象的上下文中执行。由于
window.s
不存在,因此会出现错误。您可以将闭包传递给setTimeout,以使s变量保持在作用域中,如下所示:

var t = setTimeout(function() {s.d.dialog('destroy'); }, s.o.msgTime * 1000);

这确实解决了一些问题,但我得到了一个不同的错误:“Uncaught TypeError:Object#没有方法'dialog'$.loader.impl.close.s.d”确实解决了一些问题,但我得到了一个不同的错误:“Uncaught TypeError:Object#没有方法'dialog'$.loader.impl.close.s.d”确实解决了一些问题,但我得到了一个不同的错误:“Uncaught TypeError:Object#没有方法'dialog'$.loader.impl.close.s.d”确实修复了一些问题,但我得到了一个不同的错误:“Uncaught TypeError:Object#没有方法'dialog'$.loader.impl.close.s.d”第一个答案修复了一件事,但我得到了另一件事:“Uncaught TypeError:Object#没有方法'dialog'$.loader.impl.close.s.d”“@user什么是
dialog
以及它的定义在哪里?第一个答案修复了一件事,但我得到了另一件事:“未捕获的TypeError:Object#没有方法'dialog'$.loader.impl.close.s.d”@user什么是
dialog
以及它的定义在哪里?