Javascript从匿名函数访问外部对象属性
我的目标如下:Javascript从匿名函数访问外部对象属性,javascript,Javascript,我的目标如下: var object = { attr1 : "hello", myFunc : function() { alert(this.attr1); //This should alert "hello" }, initialize : function() { document.getElementById("myElem").addEventListener("click", function
var object = {
attr1 : "hello",
myFunc : function() {
alert(this.attr1); //This should alert "hello"
},
initialize : function() {
document.getElementById("myElem").addEventListener("click", function() {
// How do I access attr1 from here?
myFunc(); // Says myFunc is not defined.
});
}
}
object.initialize();
如何从传递给addEventListener的匿名函数内部访问myFunc
或attr1
我能想到的一个方法是:
var object = {
attr1 : "hello",
myFunc : function() {
alert(this.attr1); //This should alert "hello"
},
initialize : function() {
myObject = this;
document.getElementById("myElem").addEventListener("click", function() {
// How do I access attr1 from here?
alert(myObject.attr1);
// calling myFunc
myObject.myFunc();
});
}
}
object.initialize();
但这是一个好的解决方案吗
此外,如果我这样做:
var object = {
attr1 : "hello",
myFunc : function() {
alert(this.attr1); //This should alert "hello"
},
initialize : function() {
myFunction = this.myFunc;
document.getElementById("myElem").addEventListener("click", function() {
// How do I access attr1 from here?
alert(myObject.attr1);
// calling myFunc
myFunction();
});
}
}
object.initialize();
然后用“未定义”发出警报。这意味着此.attr1
未定义。
为什么会这样?在事件处理程序函数中,
此
将始终引用已附加事件的DOM元素
要访问对象属性,您需要使用诸如self/that之类的选项
initialize : function() {
var that = this;
document.getElementById("myElem").addEventListener("click", function() {
alert(that.attr1);
that.myFunc();
});
}
在解决方案中,您已全局声明myObject
,因为缺少var
var对象={
属性1:“你好”,
myFunc:function(){
警报(“窗口实例?”+(此窗口实例));
alert(this.attr1);//这应该会提醒“hello”
},
初始化:函数(){
myFunction=this.myFunc;
document.getElementById(“myElem”).addEventListener(“单击”,函数(){
//如何从这里访问attr1?
警报(object.attr1);
//调用myFunc
myFunction();
});
}
}
初始化()代码>
单击我
在事件处理程序函数中,此
将始终引用已附加事件的DOM元素
要访问对象属性,您需要使用诸如self/that之类的选项
initialize : function() {
var that = this;
document.getElementById("myElem").addEventListener("click", function() {
alert(that.attr1);
that.myFunc();
});
}
在解决方案中,您已全局声明myObject
,因为缺少var
var对象={
属性1:“你好”,
myFunc:function(){
警报(“窗口实例?”+(此窗口实例));
alert(this.attr1);//这应该会提醒“hello”
},
初始化:函数(){
myFunction=this.myFunc;
document.getElementById(“myElem”).addEventListener(“单击”,函数(){
//如何从这里访问attr1?
警报(object.attr1);
//调用myFunc
myFunction();
});
}
}
初始化()代码>
单击我
您提供的解决方案正是我解决此问题的方法,声明一个变量并将其值设置为此
,然后使用它调用对象中的其他函数
otherFunc: function() {
console.log('test');
},
myFunc: function() {
var self = this;
// do stuff
// call other function
self.otherFunc();
}
您提供的解决方案正是我着手解决这个问题的方式,声明一个变量并将其值设置为this
,然后使用它调用对象中的其他函数
otherFunc: function() {
console.log('test');
},
myFunc: function() {
var self = this;
// do stuff
// call other function
self.otherFunc();
}
就这样吧->
您不需要额外的变量来使代码变得如此晦涩难懂。:)
var对象={
属性1:“你好”,
myFunc:函数(){
alert(this.attr1);//这应该会提醒“hello”
},
初始化:函数(){
document.getElementById(“myElem”).addEventListener(“单击”,函数)(){
//如何从这里访问attr1?
object.myFunc();
});
}
}
初始化()代码>就这样做吧->
您不需要额外的变量来使代码变得如此晦涩难懂。:)
var对象={
属性1:“你好”,
myFunc:函数(){
alert(this.attr1);//这应该会提醒“hello”
},
初始化:函数(){
document.getElementById(“myElem”).addEventListener(“单击”,函数)(){
//如何从这里访问attr1?
object.myFunc();
});
}
}
初始化()代码>是的,这是一个常见的解决方案,但是您忘记声明变量var myObject=this
@dystroy您可以通过编辑我的代码在新的答案中显示它吗?虽然您的是一个典型的技术和一个很好的解决方案,但您也可以使用bind()
函数:.addEventListener(“单击”函数(){}.bind(this))代码>为什么不仅仅是object.attr1
和object.myFunc
?您也可以直接使用object而不声明新变量,如object.myFunc()
或object.attr1
是的,这是一个常见的解决方案,但是你忘了声明变量var myObject=this
@dystroy你能通过编辑我的代码在新的答案中显示它吗?虽然你的是一种典型的技术和很好的解决方案,但你也可以使用bind()
函数:.addEventListener(“单击”函数(){}.bind(this))
为什么不只是object.attr1
和object.myFunc
?您也可以直接使用object而不声明新变量,例如object.myFunc()
或object.attr1
请注意self
,因为在其中可能是一个保留(且只读)关键字。(在一些基于Gecko的浏览器中。)小心使用self
,因为其中可能有一个保留(且只读)关键字。(在一些基于Gecko的浏览器中)这种方法有任何副作用吗?或者其他方法?据我所见,可读性受到其他方法的影响,当你有额外的变量,关于代码,没有我的经验时,会有更多的错误空间。这种方法有任何副作用吗?或者其他方法?从我的经验来看,可读性受到其他方法的影响,当你有额外的变量,关于代码,没有我的经验时,会有更多的错误空间。