在 Javascript 中调用对象方法时不是函数类型错误
Not a Function TypeError when Calling Object Method in Javascript
问题:
当我尝试在 JavaScript 中以这种特定方式调用对象方法时,出现以下错误:
TypeError: listener.update is not a function
我的代码:
<html>
<head>
<script src="library.js"></script>
</head>
<body>
<script>
// manages listeners etc.
function Model() {
var listeners = [];
this.addListener = function(listener) {
listeners.push(listener);
};
// the model will call the listeners when "setting the selection"
this.setSelection = function() {
for (listener in listeners)
listener.update();
};
};
// test function that will be used as update
function moveon() {
var answer = confirm("Ready to move on?");
if (answer) window.location = "http://google.com";
}
// create a model and add a listener
var model = new Model();
var listnr = {};
listnr.update = moveon;
model.addListener(listnr);
// update listener
setTimeout(model.setSelection, 2000); // this doesn't work
// setTimeout(listnr.update, 2000); // but this does
</script>
</body>
</html>
代码解释:
Model
对象管理 listeners
的列表,并在某些状态发生变化时调用它们的 update
方法。在我的示例中,这发生在调用 setSelection
时。
注:
这个错误不是很有见地,而且,如果我取消注释最后一行,listnr.update
工作正常。
问题:
为什么从模型调用方法时会出现此错误and/or如何解决此问题?
model.setSelection
不保留对对象的引用。如果您不需要支持旧版浏览器,您可以将其绑定到对象:
model.setSelection.bind(model)
如果您确实需要担心较旧的浏览器,您可以使用一个小的匿名函数:
function () { model.setSelection(); }
任何一种方法都会保留 setSelection
工作所必需的对象引用。
listnr.update
起作用的原因是因为那不是同一类型的函数;您构建了一个独立的非对象函数,并将对它的引用设置到该对象中,所以它工作得很好。但是如果您尝试使用模型,您将无法更新对象本身。
问题:
当我尝试在 JavaScript 中以这种特定方式调用对象方法时,出现以下错误:
TypeError: listener.update is not a function
我的代码:
<html>
<head>
<script src="library.js"></script>
</head>
<body>
<script>
// manages listeners etc.
function Model() {
var listeners = [];
this.addListener = function(listener) {
listeners.push(listener);
};
// the model will call the listeners when "setting the selection"
this.setSelection = function() {
for (listener in listeners)
listener.update();
};
};
// test function that will be used as update
function moveon() {
var answer = confirm("Ready to move on?");
if (answer) window.location = "http://google.com";
}
// create a model and add a listener
var model = new Model();
var listnr = {};
listnr.update = moveon;
model.addListener(listnr);
// update listener
setTimeout(model.setSelection, 2000); // this doesn't work
// setTimeout(listnr.update, 2000); // but this does
</script>
</body>
</html>
代码解释:
Model
对象管理 listeners
的列表,并在某些状态发生变化时调用它们的 update
方法。在我的示例中,这发生在调用 setSelection
时。
注:
这个错误不是很有见地,而且,如果我取消注释最后一行,listnr.update
工作正常。
问题:
为什么从模型调用方法时会出现此错误and/or如何解决此问题?
model.setSelection
不保留对对象的引用。如果您不需要支持旧版浏览器,您可以将其绑定到对象:
model.setSelection.bind(model)
如果您确实需要担心较旧的浏览器,您可以使用一个小的匿名函数:
function () { model.setSelection(); }
任何一种方法都会保留 setSelection
工作所必需的对象引用。
listnr.update
起作用的原因是因为那不是同一类型的函数;您构建了一个独立的非对象函数,并将对它的引用设置到该对象中,所以它工作得很好。但是如果您尝试使用模型,您将无法更新对象本身。