Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.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 - Fatal编程技术网

Javascript 如何在事件处理程序中包含函数(及其参数),而不在页面加载时调用该函数?

Javascript 如何在事件处理程序中包含函数(及其参数),而不在页面加载时调用该函数?,javascript,Javascript,我正在重构这段代码 $("#one").on("click", function() { if(operator === undefined) { firstArray.push("1"); } else { secondArray.push("1"); } }); $("#two").on("click", function() { if(operat

我正在重构这段代码

$("#one").on("click", function() {
        if(operator === undefined) {
            firstArray.push("1");
        }
        else {
            secondArray.push("1");
        }
    });
    $("#two").on("click", function() {
        if(operator === undefined) {
            firstArray.push("2");
        }
        else {
            secondArray.push("2");
        }
    });
    $("#three").on("click", function() {
        if(operator === undefined) {
            firstArray.push("3");
        }
        else {
            secondArray.push("3");
        }
    });
    $("#four").on("click", function() {
        console.log("4");
        if(operator === undefined) {
            firstArray.push("4");
        }
        else {
            secondArray.push("4");
        }
    });
    $("#five").on("click", function() {
        console.log("5");
        if(operator === undefined) {
            firstArray.push("5");
        }
        else {
            secondArray.push("5");
        }
    });
    $("#six").on("click", function() {
        console.log("6");
        if(operator === undefined) {
            firstArray.push("6");
        }
        else {
            secondArray.push("6");
        }
    });
    $("#seven").on("click", function() {
        console.log("7");
        if(operator === undefined) {
            firstArray.push("7");
        }
        else {
            secondArray.push("7");
        }
    });
    $("#eight").on("click", function() {
        console.log("8");
        if(operator === undefined) {
            firstArray.push("8");
        }
        else {
            secondArray.push("8");
        }
    });
    $("#nine").on("click", function() {
        console.log("9");
        if(operator === undefined) {
            firstArray.push("9");
        }
        else {
            secondArray.push("9");
        }
    });
    $("#zero").on("click", function() {
        console.log("0");
        if(operator === undefined) {
            firstArray.push("0");
        }
        else {
            secondArray.push("0");
        }
    });
进入这个

function pushNumber(numberToPush) {
        if(operator === undefined) {
            firstArray.push(numberToPush);
        }
        else {
            secondArray.push(numberToPush);
        }
    }

    $("#one").on("click", pushNumber("1"));
    $("#two").on("click", pushNumber("2"));
    $("#three").on("click", pushNumber("3"));
    $("#four").on("click", pushNumber("4"));
    $("#five").on("click", pushNumber("5"));
    $("#six").on("click", pushNumber("6"));
    $("#seven").on("click", pushNumber("7"));
    $("#eight").on("click", pushNumber("8"));
    $("#nine").on("click", pushNumber("9"));
    $("#zero").on("click", pushNumber("0"));
当我尝试上面的代码时,pushNumber函数在页面加载时被调用。我知道这是因为我放了括号,从而调用了函数。但是,我不知道如果不这样做,如何将参数传递给函数

非常感谢您的帮助,谢谢。

您要做的是“curry”一个函数,或者生成一个已经添加了一些参数的新函数

首先,我们将创建一个函数,为每个单击处理程序生成一个新函数:

function generateHandler(argument) {
    return function() {
        pushNumber(argument);
    };
}
然后,您可以这样使用它:

$("#one").on("click", generateHandler("1"));
function pushNumber(numberToPush) 
    return function() {
        if(operator === undefined) {
            firstArray.push(numberToPush);
        } else {
            secondArray.push(numberToPush);
        }
    };
}

你想要的是一种叫做局部涂抹或咖喱的东西。您可以使用高阶函数为您的案例手动执行此操作,如下所示:

$("#one").on("click", generateHandler("1"));
function pushNumber(numberToPush) 
    return function() {
        if(operator === undefined) {
            firstArray.push(numberToPush);
        } else {
            secondArray.push(numberToPush);
        }
    };
}

但是许多实用性库也提供了一个
curry
partial
函数,您可以使用它来包装您的函数。

谢谢您的支持。这似乎是一个非常有用的概念,尽管它可能是我最喜欢的一个,因为它的名字;)。请注意,您现在可以在此基础上进一步进行重构:
[“零”、“一”、“九”].forEach(函数(名称,nbr){$(“#”+name).on(“click”).generateHandler(“+nbr);})
为元素添加一个data-*属性,然后执行类似于:
$(“某些选择器”).单击(函数(){pushNumber($(this).attr(“数据值”);});