0

我想设置嵌套命名空间来组织我的代码。我正在尝试遵循本文中描述的类似插件的结构。问题是我不明白如何this.error_msg在我的示例中访问。我设置正确了吗?我必须使用 jQuery.extend还是.prototype访问this.error_msg

(function(TC, $, undefined){

    TC.ajax = function() {
        this.error_msg = 'default error...';         
    };

    TC.ajax.run = function(){
        //do stuff...
        TC.ajax.handle_error();
    };

    TC.ajax.handle_error = function(){
        alert(this.error_msg);
    };        

}(window.TC = window.TC || {}, jQuery));

// Test it
TC.ajax.run();

演示:http: //jsfiddle.net/g99yt/

4

5 回答 5

3

我认为您的代码必须如下所示:

(function(TC, $, undefined){
    _this = this;
    TC.ajax = function() {
        _this.error_msg = 'default error...';         
    };

    TC.ajax.run = function(){
        //do stuff...
        TC.ajax.handle_error();
    };

    TC.ajax.handle_error = function(){
        alert(_this.error_msg);
    };        

}(window.TC = window.TC || {}, jQuery));

// Test it
TC.ajax.run();
于 2013-03-14T19:29:53.143 回答
3

要记住的重要一点是,每次使用 时function(),您都在创建一个新范围。所以你可以在你的TC.ajax.handle_error方法中看到它this.error_msg是未定义的,因为你没有在那个范围内定义它。您可以做的一件事是创建原型以确保这些方法与您的 ajax 对象相关并声明该对象的新实例,然后在其上调用您的方法。见下文 :

(function(TC, $, undefined){

    TC.ajax = function() {
        this.error_msg = 'default error...';         
    };

    TC.ajax.prototype.run = function(){
        //do stuff...
        this.handle_error.call(this);
    };

    TC.ajax.prototype.handle_error = function(){
        alert(this.error_msg);
    };        

}(window.TC = window.TC || {}, jQuery));

// Test it
 var ajaxInstance = new TC.ajax();

ajaxInstance.run();

小提琴

您确实有其他选择,例如像 @kta 那样保留局部全局变量,或者通过call函数设置范围,但这并不真正适用于您的结构。

于 2013-03-14T19:37:16.283 回答
0

这实际上是一个常见问题,目前尚不清楚this指的是什么。所以解释一下:

TC.ajax.handle_error = function(){
    alert(this.error_msg);
};   

this函数中的是TC.ajax.handle_error指函数而不是您的TC对象。因此,只需将引用保存到,TC以便您以后可以引用它:

var _this = this;

...
_this.error_msg = 'default error....';
...

TC.ajax.handle_error = function(){
     alert(_this.error_msg);
 };        
于 2013-03-14T19:38:39.183 回答
0

如果TC.ajax应该是一个构造函数,那么run()并且handle_error()需要被添加到一个原型中。

但你可以做类似的事情

TC.ajax = {};    
TC.ajax.error_msg = 'default error...'; 

在你的情况下,一旦你打电话,error_msg就会被分配到,这永远不会发生。即使那样,也会提到. 而当被调用时,指的是。thisTC.ajax()thisTCTC.ajax.handle_error()thisTC.ajax

于 2013-03-14T19:38:50.267 回答
0

这就是我最终使用的:

(function ($, TC, undefined) {

    TC.nestedNamespace = TC.nestedNamespace || {};

    //add a public function to our new namespace 
    TC.nestedNamespace.test = function () {        
       console.log("Winning!");    
    };

}(jQuery, window.TC = window.TC || {}));

TC.nestedNamespace.test();

示例JSFiddle我在相关文章的评论中发现了这种方法。

于 2013-07-11T23:18:33.640 回答