我希望调用一个原本只是匿名函数的函数,但事实证明我在代码中需要这个函数3次。 所以我定义了这样一个函数:
function saveButton() {
this.parentElement.parentElement.querySelector('h3').innerHTML = this.parentElement.querySelector('input[name="task-title"]').value;
this.parentElement.parentElement.querySelector('p').innerHTML = this.parentElement.querySelector('textarea').value;
this.parentElement.parentElement.querySelector('.popup').className = 'popup hidden';
this.parentElement.parentElement.querySelector('.overlay').className = 'overlay hidden';
saveWork();
};

我想在这样的匿名函数中调用此函数:
confirmButton.onclick = function()
saveButton();
};

但后来我意识到我无法在匿名函数中使用this
。如何在匿名函数中调用confirmButton()
?
答案 0 :(得分:2)
confirmButton.onclick = saveButton;
或
confirmButton.onclick = function(){
saveButton.call(this);
};
尽管对DOM节点和要调用的函数使用相同的名称并不是一个好习惯。将您的函数重命名为更有意义的内容,例如buttonClick
答案 1 :(得分:1)
您是否尝试过使用函数表达式? 本质上,它意味着将函数赋值给变量。 阅读this回答,了解函数表达式和函数声明之间的区别。
关于你的问题,大部分时间是这种情况:
您想要使用给定匿名函数的父作用域。
如果是这样,我会推荐这个巧妙的小技巧:
var self = this;
this.saveButton = function() { // or self.saveButton...
this.parentElement.parentElement.querySelector('h3').innerHTML = this.parentElement.querySelector('input[name="task-title"]').value;
this.parentElement.parentElement.querySelector('p').innerHTML = this.parentElement.querySelector('textarea').value;
this.parentElement.parentElement.querySelector('.popup').className = 'popup hidden';
this.parentElement.parentElement.querySelector('.overlay').className = 'overlay hidden';
saveWork();
};
confirmButton.onclick = function() {
self.saveButton();
}
这个技巧可以在任何级别的范围深度中使用,只是不要污染全局命名空间:)
答案 2 :(得分:0)
通过查看您发布的代码片段,并猜测一些事情,我建议进行以下重构:
function saveButton(parentElem) {
var myParent = parentElem || this.parentElement;
myParent.parentElement.querySelector('h3').innerHTML = myParent.querySelector('input[name="task-title"]').value;
myParent.parentElement.querySelector('p').innerHTML = myParent.querySelector('textarea').value;
myParent.parentElement.querySelector('.popup').className = 'popup hidden';
myParent.parentElement.querySelector('.overlay').className = 'overlay hidden';
saveWork();
}
confirmButton.onclick = function() {
// I suppose when this function is called somewhere else,
// you actually know who is the parent element, so:
saveButton(document.querySelector('.theParentElement'));
};
// If you calling it somewhere where "this" is available,
// then simply call the function with no arguments:
saveButton();
上述示例中的某些变体可能会对您有所帮助。除此之外,如果不查看代码的大部分内容,我无法想出更好的答案。