改变" var"内部构造函数闭包,其中创建了新实例

时间:2014-07-24 19:08:44

标签: javascript jquery closures this

我写错了英语我很抱歉 ......

我在函数闭包中的var行为有一些不足之处,如:

var c = function(){
    var _self = this;
}

当我创建一个新实例时:

var A = new c();

A.logSelf = function(){
    console.log(_self);
}

在一个范围内(或封闭...我不知道正确的名称)_self var是undefined但是,我可以添加init()方法来重新评估{{ 1}}在所有新实例中,并使用jQuery帮助扩展构造函数的默认行为(简单地说):

_self

现在,如果我致电var c = function(obj){ var _self = this; this.name = "lol"; this.init = function(){ _self = this; } this.sayName = function(){ console.log(_self.name); } $.extend(this,obj); this.init(); } var A = new c({ name : "A", init : function(){ _self = this; }, sayA : function(){ console.log(_self.name) } }); &控制台日志中的A.sayName() A ,我说:“哇,我有史以来最好!”,但是当我尝试实例{{1 var all changed:

A.sayA()

...现在B记录 A ,但var B = new c({ name : "B", init = function(){ _self = this; } }); 记录 B (因为A.sayName()现在在c的所有instane中是我创建的最后一个实例[在这种情况下为B])...

为什么?我的错误是什么?

也许 A B 的关闭是相同的,因为两个都是同一个构造函数的实例? 但是为什么在 A B 的c方法ereditend中,A.sayA()的值是正确的?我不明白这个的意义!叹息。

工作示例

--> jsfiddle

为什么我需要这个?

在我的A& B实例我使用一些$ .ajax和jQuery处理程序,在jQuery用来回调的匿名函数里面(都知道)_self是一个东西的引用,我不能引用包装匿名函数的实例

每次我需要使用jQuery回调或使用$ .ajax的context属性时,我需要_self来轻松引用而无需重新评估var _self。

我更喜欢一次评估this,并且在我的实例的范围(或闭包)内,它永远不会改变他对_self的引用。

一些例子......

self

真正的问题在于 A

的这种方法
this

在这两种情况下,每次我需要使用时,我都需要与c = function(){ //... this.render = function() { //var __self = this; if (typeof this.view.surce === "undefined") { //this.writeRequest(); $.ajax({ url: this.config.path + "/index.shtml", data: this.config.req, datatype: "html", success: function(ht) { __self.view.elements.html = ht; __self.run(); }, error: function() { __static.log("Error inside ajax call for view TMPL"); } }) } else { this.run(); } } //... this.run = function() { if (this.view) this.$el = $(__static.tmpl(this.$tmpl.html(), this.view.elements)); this.$el.appendTo(this.$place); if (typeof this.view.callback === "function") { this.view.callback.call(this, this.$el); delete this.view.callback; } this.cases(); this.show(); } //... } 竞争。

(我在这里搜索答案,一般在谷歌搜索......但我没有找到具体案例)

2 个答案:

答案 0 :(得分:1)

这里的问题是你在实例A(和B)中分配的_self变量与函数c范围不是同一个_self变量,它是一个全局变量(在window对象中)

var c = function(obj){
    var _self = this; // scope of function 'c'
    this.name = "lol";
    this.init = function(){
        _self = this; // still scope of function 'c'
    }
    this.sayName = function(){
        console.log(_self.name); // scope of function 'c'
    }
    $.extend(this,obj);
    this.init();
}

var A = new c({
    name : "A",
    init : function(){
        _self = this; // global scope here, _self === window._self
    },
    sayA : function(){
        console.log(_self.name) // also call to the global _self object
    }

});

这样,对象A和B都在其函数中使用window._self,因此使它们共享数据。从这里学到的是,您无法使用' var'来操作函数范围中定义的变量。宣言。你可以操纵的那些你必须分配给这个' (如果是施工人员)

答案 1 :(得分:1)

var B = new c({
    name : "B",
    init = function(){
        _self = this;
    }
});

此代码段具有一个函数B.init,它将全局_self设置为B(this)。

当您定义A时它是相似的,并且还在编辑全局_self

或许你想要的是这样的

[ FIDDLE ]

使用context的{​​{1}}功能没有任何问题。但你可以这样:

$.ajax