Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从内部访问函数对象?_Javascript_Function - Fatal编程技术网

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);
});
这增加了一个额外的好处,即堆栈跟踪现在将显示函数名。

另请参见:完全正确!这就是为什么(除其他原因外)最好提供命名函数作为处理程序。。。