Javascript 声明函数的类型错误
Javascript TypeError for declared function
HTML
<input type="checkbox" class="test" id="chk" /><label for="chk">Click</label>
<p id="demo"></p>
JavaScript
(function (){
var chk = document.querySelector('.test');
function ClickTest(elem){
this.elem = elem;
};
ClickTest.prototype.addListener = function() {
this.elem.addEventListener('change', this.showValue);
};
ClickTest.prototype.showValue = function(){
console.log('Clicked');
var d = document.getElementById('demo');
d.innerHTML = "This works";
this.test();
};
ClickTest.prototype.test = function(){
console.log('Test function');
};
clickTest = new ClickTest(chk);
clickTest.addListener();
})();
我的代码在调用 this.test() 之前工作正常。我得到的错误是
TypeError: this.test is not a function
是因为 showValue 是从 addEventListener 调用的还是我这里做错了什么?
因为 addEventListener 正在调用该方法,它的上下文正在更改为 addEventListener 函数的上下文(您可以在 showValue
上控制台记录 this
以进行测试)。这可以使用 bind
方法修复(每一个双关语):
ClickTest.prototype.addListener = function() {
this.elem.addEventListener('change', this.showValue.bind(this) );
};
这确保了上下文得到维护。 bind
所做的本质上是强制该方法在它所绑定的范围内被调用。在我们的例子中,我们通过传入 this
.
将其绑定到 ClickTest
HTML
<input type="checkbox" class="test" id="chk" /><label for="chk">Click</label>
<p id="demo"></p>
JavaScript
(function (){
var chk = document.querySelector('.test');
function ClickTest(elem){
this.elem = elem;
};
ClickTest.prototype.addListener = function() {
this.elem.addEventListener('change', this.showValue);
};
ClickTest.prototype.showValue = function(){
console.log('Clicked');
var d = document.getElementById('demo');
d.innerHTML = "This works";
this.test();
};
ClickTest.prototype.test = function(){
console.log('Test function');
};
clickTest = new ClickTest(chk);
clickTest.addListener();
})();
我的代码在调用 this.test() 之前工作正常。我得到的错误是
TypeError: this.test is not a function
是因为 showValue 是从 addEventListener 调用的还是我这里做错了什么?
因为 addEventListener 正在调用该方法,它的上下文正在更改为 addEventListener 函数的上下文(您可以在 showValue
上控制台记录 this
以进行测试)。这可以使用 bind
方法修复(每一个双关语):
ClickTest.prototype.addListener = function() {
this.elem.addEventListener('change', this.showValue.bind(this) );
};
这确保了上下文得到维护。 bind
所做的本质上是强制该方法在它所绑定的范围内被调用。在我们的例子中,我们通过传入 this
.
ClickTest