javascript - JS中带参数的函数需要加参数吗
问题描述
来自Java并尝试学习Javascript,以下代码有效:
const myCustomDiv = document.createElement('div');
function respondToTheClick(evt) {
evt.target.textContent = 'This paragraph has been clicked!';
}
for (let i = 0; i < 100; i++) {
const newElement = document.createElement('p');
newElement.textContent = 'This is paragraph number ' + i;
myCustomDiv.appendChild(newElement);
}
document.body.appendChild(myCustomDiv);
myCustomDiv.addEventListener('click', respondToTheClick);
以下不是并给出错误
const myCustomDiv = document.createElement('div');
function respondToTheClick(evt) {
evt.target.textContent = 'This paragraph has been clicked!';
}
for (let i = 0; i < 100; i++) {
const newElement = document.createElement('p');
newElement.textContent = 'This is paragraph number ' + i;
myCustomDiv.appendChild(newElement);
}
document.body.appendChild(myCustomDiv);
myCustomDiv.addEventListener('click', respondToTheClick(event) ); //<--added event argument
产生的错误是:
参数类型 void 不可分配给参数类型 (this:HTMLDivElement, ev: HTMLElementEventMap[string]) => any
对于 Java,如果一个方法需要一个参数 - 它必须被提供。JS不是这种情况-如果是这样,它是如何工作的?还是只有 eventListeners 的情况?
解决方案
在 JavaScript 中,函数是一流的对象。你可以对一个函数做任何你可以对一个对象做的事情。这包括将其作为函数的参数传递。
addEventListener("click", respondToTheClick)
respondToTheClick
…作为 的第二个参数传递addEventListener
。
addEventListener('click', respondToTheClick(event) );
相当于:
let return_value = respondToTheClick(event);
addEventListener('click', return_value);
的第二个参数addEventListener
需要是一个函数。的返回值respondToTheClick(event)
不是函数。这就是为什么你得到一个错误。
当浏览器和函数内部的一些其他代码addEventListener
调用您作为参数传递给它的函数时,该代码会将事件对象作为参数传递给它。
function handleEvent(e) {
console.log(e);
}
function addEventDemo(event_type, event_handler) {
event_handler("E is " + event_type);
}
addEventDemo("click", handleEvent);
也就是说,JS 不需要您将参数传递给函数,即使它被设置为将它们分配给变量。任何您未定义的获取值undefined
。
function foo(a, b, c, d) {
console.log({ a, b, c, d });
}
foo(1, 2);
但是虽然 JS 不需要它,但函数可以强制执行。
function foo(a, b, c, d) {
if (typeof a !== "number") throw "a is not a number";
if (typeof b !== "number") throw "b is not a number";
if (typeof c !== "number") throw "c is not a number";
if (typeof d !== "number") throw "d is not a number";
console.log({ a, b, c, d });
}
foo(1, 2);
推荐阅读
- html - 对于我的登录页面,我有一张图片作为其背景。但是一旦你登录它就会转移到游戏中并阻止它
- javascript - 如何在 NGINX 上重定向并将原始请求存储为 POST 变量?
- c# - Websocket 代码在控制台中有效,但在 winform 中无效
- regex - 每千位数
- python - 根据 dask 数据框中的条件更改列变量值
- java - 使用来自模型向量的数据(具有很少的属性),而无需在 JAVA 中的 WEKA API 中制作 ARFF 文件
- twilio - 查看使用 Twilio 函数生成的 twiml
- c# - 在 C# 中使用“浮动”结构解析 XML 并填充列表框
- c++ - 拓扑排序中的邻接表表示
- codenameone - 将 PropertyBusinessObjects 列表保存到存储中