Javascript从匿名函数访问外部对象属性
Javascript access outer object attribute from anonymous 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();
然后它会发出"未定义"的警报。这意味着this.attr1
是未定义的。为什么会这样?
在事件处理程序函数中,this
将始终引用事件所附加的DOM元素。
要访问对象属性,需要使用self/that等替代选项。
initialize : function() {
var that = this;
document.getElementById("myElem").addEventListener("click", function() {
alert(that.attr1);
that.myFunc();
});
}
在您的解决方案中,您已全局声明myObject
为缺少var
。
var object = {
attr1 : "hello",
myFunc : function() {
alert("Instance of window ? "+(this instanceof Window));
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(object.attr1);
// calling myFunc
myFunction();
});
}
}
object.initialize();
<div id="myElem">Click me</div>
现在,正如您在警报中看到的,this
指的是窗口对象。因为当您复制函数时,它是按值而不是按引用。因此,只复制函数,而不复制底层对象。所以现在this
将引用窗口对象。
您提供的解决方案正是我解决这个问题的方法,声明一个变量并将其值设置为this
,然后使用它来调用对象中的其他函数。
otherFunc: function() {
console.log('test');
},
myFunc: function() {
var self = this;
// do stuff
// call other function
self.otherFunc();
}
就这样吧->您不需要额外的变量来使代码变得如此模糊。:)
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?
object.myFunc();
});
}
}
object.initialize();
相关文章:
- Javascript从匿名函数访问外部对象属性
- 在内部JavaScript函数中包含外部对象
- 覆盖外部对象's函数在Internet Explorer中使用JavaScript
- 如何使用javascript(和AJAX?)调用外部对象
- 如何将嵌套对象移动到外部对象
- 如何在我的Chrome扩展中包含外部对象
- Javascript外部对象全局
- 访问JS中的外部对象
- scroll在chrome中的svg外部对象内不起作用
- 从$.getJSON调用外部对象
- 将JSONP回调的结果保存到外部对象
- 无法从函数作用域向外部对象添加属性
- 如何在Javascript中访问外部对象上的函数
- 如何在javascript对象中访问外部对象
- 使用dojo.在对象、外部对象的方法中挂起和闭包
- Javascript:内部数组不会重置为外部对象
- 在JavaScript中,如何得到'this'外部对象的对象的方法,该对象是外部对象中数组的元素
- 使用javascript在svg中动态添加外部对象
- Dom外部对象的样式
- 从嵌套函数访问外部对象(使用主干.js