Javascript范围问题

时间:2011-04-17 14:34:29

标签: javascript jquery scoping

我正在尝试构建一个通用的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:对象#没有方法'对话框'$ .loader.impl.close.s.d”

2 个答案:

答案 0 :(得分:2)

这将使其有效:

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

当你将一个字符串传递给setTimout时,那个字符串(代码)在全局代码中执行 - 并且由于s是一个局部变量,它确实没有在全局代码中定义。

答案 1 :(得分:1)

将字符串传递给setTimeout时,字符串中的代码将在window对象的上下文中执行。由于window.s不存在,因此您会收到错误消息。您可以将闭包传递给setTimeout,以使您的变量保持在范围内,如下所示:

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