Javascript 什么';传递函数表达式变量作为参数的用法是什么?

Javascript 什么';传递函数表达式变量作为参数的用法是什么?,javascript,function,Javascript,Function,我是一名初级JS程序员,正在学习codeschool的第三个JS课程。其中一个模块引入了传递函数表达式变量作为其他函数参数的概念。然而,我需要一些帮助来理解为什么这种方法在某些情况下比在其他情况下更好。例如,以下代码适用于条件警报,该警报用于识别用户是否为新用户,并在用户注销系统时抛出自定义问候语 这就是codeschool所提倡的: 问候语; var新客户; //有些代码将变量newCustomer设置为true或false if(新客户){ 问候语=功能(){ 警告(“感谢您访问荒地!\n

我是一名初级JS程序员,正在学习codeschool的第三个JS课程。其中一个模块引入了传递函数表达式变量作为其他函数参数的概念。然而,我需要一些帮助来理解为什么这种方法在某些情况下比在其他情况下更好。例如,以下代码适用于条件警报,该警报用于识别用户是否为新用户,并在用户注销系统时抛出自定义问候语

这就是codeschool所提倡的:


问候语;
var新客户;
//有些代码将变量newCustomer设置为true或false
if(新客户){
问候语=功能(){
警告(“感谢您访问荒地!\n”+
“我们希望您的入住……比大多数人都好。”);
        
};
}否则{
问候语=功能(){
警报(“欢迎回到荒地!\n”+
“我猜他们没那么坏吧?”);
};
}
关闭终端(问候语);
函数closeTerminal(message){message();}
但为什么这比下面的更好呢


问候语;
var新客户;
//有些代码将变量newCustomer设置为true或false
closeTerminal();
函数closeTerminal(){
if(新客户){
警告(“感谢您访问荒地!\n”+
“我们希望您的入住……比大多数人都好。”);
    
}否则{
警报(“欢迎回到荒地!\n”+
“我猜他们没那么坏吧?”);
}
} 

好的开发人员会使用这些代码块(或任何其他代码)中的哪一个来实现期望的结果?如果。else语句来评估新客户并返回所需的问候语

以下是它们的使用示例:

function load_home() {
    var url = "http://localhost/inner_load/page_test.html";
    var method = "GET";
    var postData = " ";
    var async = true;
    var request = new XMLHttpRequest();

    /* Have a close look at this */
    request.onload = function () {
        var data = request.responseText;
        Contenido.innerHTML=request.responseText;
    }

    request.open(method, url, async);
    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
    request.send(postData);
}
如您所见,我可以指定一个函数,该函数定义服务器返回结果时将执行的操作。另一个例子是:

function add(a, b) {
    return a+b;
}

function mult(a, b) {
    return a*b;
}

function calculate(func, a, b) {
    return func(a, b);
}
在这种情况下,通过将函数作为参数传递,我可以选择如何处理作为
a
b
传递的值,如果我传递
add
,这两个数字将相加,如果我传递
mult
,它们将相乘

calculate(add, 10, 5);
将返回
15
。其中:

calculate(mult, 10, 5);
将返回
50


如果你正在做,比如说,一个计算器,这将为你节省很多麻烦。不必使用if…else块和一些存储整数或字符串的变量来定义要执行的操作,您只需调用函数,给出要执行的操作。

可伸缩性和可重用性的概念。用你的代码,它肯定能工作。现在。从客户端请求的任何更改都需要修改大量代码。在使用函数保持这种粒度的同时,允许您编写工作正常的代码


我自己并没有看过任何代码学校的教程,但你们可能会发现在雄辩的javascript中函数一章很有趣。是一个您可以使用的链接。

在您的解决方案版本中,您将始终只使用警告框向用户致意。本教程中的版本为closeTerminal方法的调用方提供了传递任何可以包含任何逻辑的方法的灵活性。i、 e在警报、新的jquery ui对话框、引导对话框或完全不同的逻辑中显示消息

请参阅以下代码以了解我们如何重用您的逻辑

HTML


工作示例-

在您的情况下,它并不是天生就更好

但也有一些情况并非如此简单。假设您无法修改
closeTerminal
函数,但它的开发人员仍然希望您使用其逻辑从深层执行任意功能?那就是你使用一个。为它们传递函数表达式是很自然的,但不是严格要求的。看看吧,也许吧

回调的另一个用例是异步函数,稍后您可能会遇到它们

一个更好的例子可能是

function closeTerminal(getMessage) {
    var isNewCustomer = !Math.round(Math.random()); // complicated, local logic

    var message = getMessage(isNewCustomer);
    alert(message); // print to the closing terminal
    // (which is local to this function as well)
}
你可以用

closeTerminal(function greeting(newCustomer) {
    // passing a custom function to determine the appropriate message
    if (newCustomer)
        return "Thanks for visiting the Badlands!\nWe hope your stay is...better than most.";     
    else 
        return "Welcome back to the Badlands!\nGuess they aren't so bad huh?";
});

第一个函数将
newCustomer
保持在调用
closeTerminal()
的函数的本地;第二种方法需要一个“全局”变量。
function closeTerminal(getMessage) {
    var isNewCustomer = !Math.round(Math.random()); // complicated, local logic

    var message = getMessage(isNewCustomer);
    alert(message); // print to the closing terminal
    // (which is local to this function as well)
}
closeTerminal(function greeting(newCustomer) {
    // passing a custom function to determine the appropriate message
    if (newCustomer)
        return "Thanks for visiting the Badlands!\nWe hope your stay is...better than most.";     
    else 
        return "Welcome back to the Badlands!\nGuess they aren't so bad huh?";
});