我写错了英语我很抱歉 ......
我在函数闭包中的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()
的值是正确的?我不明白这个的意义!叹息。
在我的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();
}
//...
}
竞争。
(我在这里搜索答案,一般在谷歌搜索......但我没有找到具体案例)
答案 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