Javascript 如何从内部访问函数对象?
假设我想在按钮上注册一次性事件侦听器,我可以这样写:Javascript 如何从内部访问函数对象?,javascript,function,Javascript,Function,假设我想在按钮上注册一次性事件侦听器,我可以这样写: var someButton; var once = function() { console.log("clicked"); someButton.removeEventListener("click", once); }; someButton.addEventListener("click", once); 如果我甚至不想给那个函数起个名字呢?比如: var someButton; someButton.addEventLis
var someButton;
var once = function() {
console.log("clicked");
someButton.removeEventListener("click", once);
};
someButton.addEventListener("click", once);
如果我甚至不想给那个函数起个名字呢?比如:
var someButton;
someButton.addEventListener("click", function() {
console.log("clicked");
someButton.removeEventListener("click", /* what goes here? */);
});
你需要给它起个名字。不过,您可以使用命名函数表达式
someButton.addEventListener("click", function foo () {
console.log("clicked");
someButton.removeEventListener("click", foo);
});
它将被限定范围,因此只能从函数中访问
或者,使用addEventListener的新选项语法(非常新,需要Chrome 55或Firefox 50,在编写本文时不支持MSIE、Opera或stable Safari):
someButton.addEventListener("click", function () {
console.log("clicked");
}, { once: true });
您可以为函数指定一个名称,该名称不在除其内部以外的任何范围内:
var someButton;
someButton.addEventListener("click", function handler() {
console.log("clicked");
someButton.removeEventListener("click", handler);
});
这不会在someButton
所在的范围内创建处理程序标识符绑定。(历史记录:IE8和更早版本在其出现的地方有一个bug。)
如果您确实不想这样做,并且不介意使用松散模式和不推荐使用的东西,则可以使用参数。被调用方
:
// NOT RECOMMENDED AT ALL. WILL NOT WORK IN STRICT MODE.
var someButton;
someButton.addEventListener("click", function() {
console.log("clicked");
someButton.removeEventListener("click", arguments.callee);
});
如果我甚至不想给那个函数起个名字呢?比如:
var someButton;
someButton.addEventListener("click", function() {
console.log("clicked");
someButton.removeEventListener("click", /* what goes here? */);
});
不管怎样,给它起个名字吧
var someButton;
someButton.addEventListener("click", function once() {
console.log("clicked");
someButton.removeEventListener("click", once);
});
这增加了一个额外的好处,即堆栈跟踪现在将显示函数名。另请参见:完全正确!这就是为什么(除其他原因外)最好提供命名函数作为处理程序。。。