Javascript范围界定问题

| 我正在尝试构建通用的Ajax加载器,而ajax正在运行带有动画“加载” gif的灯箱。 我在范围界定方面有一些问题。 代码是:
var t=setTimeout( \"s.d.dialog( \'destroy\' )\" ,(s.o.msgTime*1000));
错误是:
\"Uncaught ReferenceError: s is not defined\"
;(function ($) { 
      $.loader = function (data, options) {
    return $.loader.impl.init(data, options);
  };

  $.loader.close = function (data) {
    $.loader.impl.close(data);
  };

  $.loader.create = function () {
    $.loader.impl.create();
  };

$.loader.defaults = {
        appendTo: \'body\',
        autoCreate: true,
        msgTime: 5,
    };

$.loader.impl = {
    d: {},
    init: function(data, options){

        var s = this;
        s.o = $.extend({}, $.loader.defaults, options);

        if ((typeof data === \'object\')&&!(data instanceof jQuery)&&data.url) {

            data.success = function(data, textStatus, jqXHR){ $.loader.close(); }
            data.error = function(jqXHR, textStatus, errorThrown){ $.loader.close(\'Error accessing server\'); }
            $.ajax(data);
        }else if(s.o.autoCreate){
            s.create();
        }

        return s;
    },
    create: function() {
       var s = this;
       s.d = $(\'<div  id=\"dialog\" style=\"display:hidden\"><span style=\"width: 100%\" id=\"loading_diag\"><center><img src=\"http://www.mydomain.com/images/ajax-loader.gif\" /></center></span></div>\').appendTo(s.o.appendTo);
       s.d.dialog({ title: \'Loading ...\', dialogClass: \'noTitleStuff\', modal: true, draggable: false, resizable: false });

    },
    close: function(data)
    {
        var s = this;
        //alert(typeof s.d);
        if ((typeof data === \'string\')&&data) {
            $(\"#loading_diag\").hide();
            $(\"#dialog\").html(data);

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

        s.d= {};
    },
};

})(jQuery);
如果有人知道如何解决,请分享。 第一个和第二个解决方案做了一些事情,但还没有完全解决它, 现在我遇到了另一个错误:\“未捕获的TypeError:对象#没有方法\'dialog \'$ .loader.impl.close.s.d \”     
已邀请:
这将使其工作:
var t = setTimeout(function() { s.d.dialog(\'destroy\'); }, s.o.msgTime * 1000);
当您将字符串传递给
setTimout
时,该字符串(代码)将在全局代码中执行-并且由于
s
是局部变量,因此它的确不在全局代码中定义。     
将字符串传递给setTimeout时,字符串中的代码在is6ѭ对象的上下文中执行。由于ѭ7不存在,因此您会收到错误消息。您可以将闭包传递给setTimeout,以将s变量保持在如下范围内:
var t = setTimeout(function() {s.d.dialog(\'destroy\'); }, s.o.msgTime * 1000);
    

要回复问题请先登录注册