简体   繁体   English

如何将 function 作为参数传递给其他函数以避免重复代码

[英]How to pass a function as argument to other functions in order to avoid repeating code

I'm trying to implement handleLocalStorage into some other functions in order to avoid repeating code.我正在尝试将handleLocalStorage实现到其他一些函数中以避免重复代码。

But how exactly can I pass the above mentioned function to other functions?但是我如何才能将上面提到的 function 传递给其他函数呢?

Any help is much appreciated.任何帮助深表感谢。

 function handleLocalStorage() { let localTodos; if (localStorage.getItem("localTodos") === null) { localTodos = []; } else { localTodos = JSON.parse(localStorage.getItem("localTodos")); } } function saveTodos(todo) { // let localTodos; // if (localStorage.getItem("localTodos") === null) { // localTodos = []; // } else { // localTodos = JSON.parse(localStorage.getItem("localTodos")); // } localTodos.push(todo); localStorage.setItem("localTodos", JSON.stringify(localTodos)); } function getTodos(todo) { // let localTodos; // if (localStorage.getItem("localTodos") === null) { // localTodos = []; // } else { // localTodos = JSON.parse(localStorage.getItem("localTodos")); // } localTodos.forEach(function(todo) { const newTodoDiv = document.createElement("div"); newTodoDiv.classList.add("todo"); const todoTitle = document.createElement("li"); todoTitle.innerText = todo; todoTitle.classList.add("todo-item"); newTodoDiv.appendChild(todoTitle); const checkedBtn = document.createElement("button"); checkedBtn.innerHTML = "<i class='far fa-check-square'></i>"; checkedBtn.classList.add("checked-btn"); newTodoDiv.appendChild(checkedBtn); const delBtn = document.createElement("button"); delBtn.innerHTML = "<i class='far fa-trash-alt'></i>"; delBtn.classList.add("del-btn"); newTodoDiv.appendChild(delBtn); todoList.appendChild(newTodoDiv); }); } function clearTodos(todo) { // let localTodos; // if (localStorage.getItem("localTodos") === null) { // localTodos = []; // } else { // localTodos = JSON.parse(localStorage.getItem("localTodos")); // } const todoIndex = todo.children[0].innerText; localTodos.splice(localTodos.indexOf(todoIndex), 1); localStorage.setItem("localTodos", JSON.stringify(localTodos)); }

you can pass a function as a parameter to another function, this is usually referred to as "callback functions" .您可以将一个 function 作为参数传递给另一个 function,这通常称为“回调函数”

first i would make the handleLocalStorage function return the localTodos value:首先我会让handleLocalStorage function 返回 localTodos 值:

function handleLocalStorage() {
  const localTodos = localStorage.getItem("localTodos");
  if (localTodos === null) {
    return [];
  }

  return JSON.parse(localTodos);
}

then add another argument to your function's signature and then call this argument (like you call a function)然后将另一个参数添加到函数的签名中,然后调用此参数(就像调用函数一样)

function saveTodos(getLocalTodos, todo) {
  const localTodos = getLocalTodos();
  ... //rest of code

then just send it as an argument:然后将其作为参数发送:

saveTodos(handleLocalStorage, todo);

You can easily pass functions to parameters of other functions.您可以轻松地将函数传递给其他函数的参数。 For example:例如:

function foo() {
  console.log("foo");
}

function bar(functionParam) {
  functionParam();
  console.log("bar");
}

bar(foo); // The console output is `foo\nbar`

However, I think this will not help you.但是,我认为这对您没有帮助。 You can simply use function calls to achieve the effect you want.你可以简单地使用function调用来达到你想要的效果。 Like so:像这样:

function getLocalTodos() {
  let localTodos;
  if (localStorage.getItem("localTodos") === null) {
    localTodos = [];
  } else {
    localTodos = JSON.parse(localStorage.getItem("localTodos"));
  }
  return localTodos;
}

function saveTodos(todo) {
  let localTodos = getLocalTodos();

  localTodos.push(todo);
  localStorage.setItem("localTodos", JSON.stringify(localTodos));
}

You can have handleLocalStorage return localTodos instead of passing it to other functions and simply call it where it is needed.您可以让 handleLocalStorage 返回 localTodos 而不是将其传递给其他函数,并在需要的地方简单地调用它。

function handleLocalStorage() {
  let localTodos;
  if (localStorage.getItem("localTodos") === null) {
    localTodos = [];
  } else {
    localTodos = JSON.parse(localStorage.getItem("localTodos"));
  }
  return localTodos;
}


function saveTodos(todo) {
  let localTodos = handleLocalStorage();
  localTodos.push(todo);
  localStorage.setItem("localTodos", JSON.stringify(localTodos));
}

PS In javascript, if you need to pass function to a different function, you can simply pass it like you would any other argument. PS 在 javascript 中,如果您需要将 function 传递给另一个 function,您可以像传递任何其他参数一样简单地传递它。

function funcA(){return 10;}
function funcB(fun){console.log(fun());}
funcB(funcA);
//logs 10
let funcA = function () { 
    console.log("Hello from funcA"); 
}
let funcB = function(funcAsArgument, otherArgument) {
    funcAsArgument();
    console.log("Other Argument: ", otherArgument);
}

funcB(funcA, "Dummy Argument") //Passing funcA() as argument to funcB

// Prints
// Hello from funcA
// Other Argument:  Dummy Argument
//

If you want to pass a function as an argument to an another function, you can specify the name of function as the argument.如果要将一个 function 作为参数传递给另一个 function,您可以指定 function 的名称作为参数。

Working Example工作示例

 function handleLocalStorage() { console.log('Inside handleLocalStorage function'); } function saveTodos(listner) { //listner is handleLocalStorage function console.log('Inside saveTodos function'); console.log('clearTodos saveTodos calls handleLocalStorage'); listner(); } function getTodos(listner1, listner2) { //listner1 is saveTodos function //listner2 is saveTodos handleLocalStorage console.log('Inside getTodos function'); console.log('clearTodos getTodos calls saveTodos'); listner1(listner2); } function clearTodos(todo) { console.log('Inside clearTodos function'); console.log('clearTodos function calls getTodos'); getTodos(saveTodos, handleLocalStorage); } clearTodos();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM