Javascript 在addEventListener方法中,将参数x传递给实现console.log(x)的匿名函数如何返回事件?
我不明白Javascript 在addEventListener方法中,将参数x传递给实现console.log(x)的匿名函数如何返回事件?,javascript,dom-events,anonymous-function,console.log,Javascript,Dom Events,Anonymous Function,Console.log,我不明白console.log(x)在下面的情况下是如何工作的。 我理解addEventListener(“keydown”,function)意味着当按下键时,执行该功能(此处打印到控制台) 然而,当我们在addEventListener()方法中将一个参数传递给一个匿名函数(这里是x),然后实现console.log(x)将keydown事件打印到console时,我真的无法理解它是如何工作的 document.addEventListener(“向下键”,函数(x){ console.lo
console.log(x)
在下面的情况下是如何工作的。
我理解addEventListener(“keydown”,function)
意味着当按下键时,执行该功能(此处打印到控制台)
然而,当我们在addEventListener()方法中将一个参数传递给一个匿名函数(这里是x
),然后实现console.log(x)将keydown
事件打印到console时,我真的无法理解它是如何工作的
document.addEventListener(“向下键”,函数(x){
console.log(x);//例如KeyboardEvent{isTrusted:true,key:x,code:KeyX,location:0,ctrlKey:false,…}
});
同
(一个小提示是,对于事件
我可以只使用函数()
,它仍在工作):
document.addEventListener(“keydown”,function(){//这里不需要输入`event`作为参数
console.log(event);//例如KeyboardEvent{isTrusted:true,key:x,code:KeyX,location:0,ctrlKey:false,…}
});
但是
document.addEventListener(“keydown”,function(){//无参数
console.log(x);//未捕获引用错误:未定义x
});
当触发事件时,被调用的函数会获取默认情况下作为参数传递给它的事件
对象。在第一种情况下,由于函数的唯一参数是x
,因此它接收事件
对象。事实上,这相当于写下:
document.addEventListener("keydown", function() {
var x = event;
console.log(x);
});
在第二种情况下,您直接通过
事件
变量访问事件
对象(即不将其分配给另一个变量)。在第三种情况下,您试图访问一个未定义的变量x
,因此会出现错误消息。当触发事件时,调用的函数会默认将事件
对象作为参数传递给它。在第一种情况下,由于函数的唯一参数是x
,因此它接收事件
对象。事实上,这相当于写下:
document.addEventListener("keydown", function() {
var x = event;
console.log(x);
});
在第二种情况下,您直接通过
事件
变量访问事件
对象(即不将其分配给另一个变量)。在第三种情况下,您试图访问一个未定义的变量x
,因此出现了错误消息。让我们用自己的逻辑复制这些场景,以更好地说明发生了什么。我将通过直接调用回调来简化一些事情,而不是等待事件。这对你所问的事情没有任何影响
安装程序
让我们考虑下面的简单函数,它接受并调用回调:
function fire(callback) {
callback(42);
}
如您所见,fire
将参数传递给回调函数
事件处理程序也是这样:当事件触发时,浏览器将调用事件处理程序并将当前事件对象传递给它
第一种情况
如果函数定义了一个参数,它可以访问传递给它的参数。因此,如果我按如下方式调用fire
:
fire(function(x) {
console.log(x);
});
然后我的回调接收并记录42
。我可以为参数选择任何名称,这样就可以了
这与第一个示例中的相同:您正在定义一个参数并决定将其命名为x
。你可以给它取其他名字
第二种情况
在本例中,您正在访问变量事件
。因为变量不是在函数内部定义的,也不是参数,所以它将在外部范围中查找(闭包基本上就是这样工作的)。现在,事件
恰好是一个事件
在我们的玩具示例中,这将如何工作?假设fire
首先将值分配给全局变量:
var globalArg;
function fire(callback) {
globalArg = 42;
callback(globalArg);
}
您可以看到,该值作为回调的参数以及全局变量globalArg
可用。这就是为什么这两个示例都有效(对应于第一个和第二个场景):
第三种情况
与第二种情况类似,
x
是一个既不是函数内部定义的变量,也不是参数。因此,在外部环境中查找变量。但是,它也不存在,因此会抛出错误。让我们用自己的逻辑复制这些场景,以更好地说明发生了什么。我将通过直接调用回调来简化一些事情,而不是等待事件。这对你所问的事情没有任何影响
安装程序
让我们考虑下面的简单函数,它接受并调用回调:
function fire(callback) {
callback(42);
}
如您所见,fire
将参数传递给回调函数
事件处理程序也是这样:当事件触发时,浏览器将调用事件处理程序并将当前事件对象传递给它
第一种情况
如果函数定义了一个参数,它可以访问传递给它的参数。因此,如果我按如下方式调用fire
:
fire(function(x) {
console.log(x);
});
然后我的回调接收并记录42
。我可以为参数选择任何名称,这样就可以了
这与第一个示例中的相同:您正在定义一个参数并决定将其命名为x
。你可以给它取其他名字
第二种情况
在本例中,您正在访问变量事件
。因为变量不是在函数内部定义的,也不是参数,所以它将在外部范围中查找(闭包基本上就是这样工作的)。现在,事件
恰好是一个事件
在我们的玩具示例中,这将如何工作?假设fire
首先将值分配给全局变量:
var globalArg;
function fire(callback) {
globalArg = 42;
callback(globalArg);
}
您可以看到,该值作为回调的参数以及全局变量globalArg
可用。这就是为什么这两个示例都能工作(对应于您的第一个和第二个示例)