zoukankan      html  css  js  c++  java
  • JavaScript 基础知识 5 函数

        函数
    函数是程序的主要“构建模块”。函数使该段代码可以被调用很多次,而不需要写重复的代码。

    函数声明
    使用 函数声明 创建函数。
    看起来就像这样:

    function showMessage() {
    alert( 'Hello everyone!' );
    }
    function 关键字首先出现,然后是 函数名,然后是括号之间的 参数 列表(用逗号分隔,在上述示例中为空),最后是花括号之间的代码(即“函数体”)。

    我们的新函数可以通过名称调用:showMessage()。

      局部变量
    在函数中声明的变量只在该函数内部可见
    例如:
    function showMessage() {
    let message = "Hello, I'm JavaScript!"; // 局部变量
    alert( message );
    }
    showMessage(); // Hello, I'm JavaScript!
    alert( message ); // <-- 错误!变量是函数的局部变量


      外部变量
    函数也可以访问外部变量,例如:

    let userName = 'John';
    function showMessage() {
    let message = 'Hello, ' + userName;
    alert(message);
    }
    showMessage(); // Hello, John

    函数对外部变量拥有全部的访问权限。函数也可以修改外部变量
    例如:
    let userName = 'John';
    function showMessage() {
    userName = "Bob"; // (1) 改变外部变量
    let message = 'Hello, ' + userName;
    alert(message);
    }
    alert( userName ); // John 在函数调用之前
    showMessage();
    alert( userName ); // Bob,调用之后值被函数修改了

      只有在没有局部变量的情况下才会使用外部变量。
    如果在函数内部声明了同名变量,那么函数会 遮蔽 外部变量。例如,在下面的代码中,函数使用局部的 userName,而外部变量被忽略:

    let userName = 'John';
    function showMessage() {
    let userName = "Bob"; // 声明一个局部变量
    let message = 'Hello, ' + userName; // Bob
    alert(message);
    }
    showMessage(); // 函数会创建并使用它自己的 userName
    alert( userName ); // John,未被更改,函数没有访问外部变量。

        参数
    我们可以使用参数(也称“函数参数”)来将任意数据传递给函数。
    在如下示例中,函数有两个参数:from 和 text。

    function showMessage(from, text) { // 参数:from 和 text
    alert(from + ': ' + text);
    }
    showMessage('Ann', 'Hello!'); // Ann: Hello! (*)
    showMessage('Ann', "What's up?"); // Ann: What's up? (**)

    当函数在 (*) 和 (**) 行中被调用时,给定值被复制到了局部变量 from 和 text。然后函数使用它们进行计算。

    这里还有一个例子:我们有一个变量 from,并将它传递给函数。请注意:函数修改 from,但在函数外部看不到更改,因为函数修改的是复制的变量值副本

    function showMessage(from, text) {
    from = '*' + from + '*'; // 让 "from" 看起来更优雅
    alert( from + ': ' + text );
    }
    let from = "Ann";
    showMessage(from, "Hello"); // *Ann*: Hello
    // "from" 值相同,函数修改了一个局部的副本。
    alert( from ); // Ann


      默认值
    如果未提供参数,那么其默认值则是 undefined
    例如,之前提到的函数 showMessage(from, text) 可以只使用一个参数调用:
    showMessage("Ann");
    那不是错误,这样调用将输出 "*Ann*: undefined"。这里没有参数 text,所以程序假定 text === undefined。

    如果我们想在本示例中设定“默认”的 text,那么我们可以在 = 之后指定它

    function showMessage(from, text = "no text given") {
    alert( from + ": " + text );
    }

    showMessage("Ann"); // Ann: no text given
    现在如果 text 参数未被传递,它将会得到值 "no text given"。

    这里 "no text given" 是一个字符串,但它可以是更复杂的表达式,并且只会在缺少参数时才会被计算和分配。所以,这也是可能的:

    function showMessage(from, text = anotherFunction()) {
    // anotherFunction() 仅在没有给定 text 时执行
    // 其运行结果将成为 text 的值
    }


      后备的默认参数
    有些时候,将参数默认值的设置放在函数执行(相较更后期)而不是函数声明的时候,也能行得通。

    为了判断参数是否被省略掉,我们可以拿它跟 undefined 做比较:

    function showMessage(text) {
    if (text === undefined) {
    text = 'empty message';
    }

    alert(text);
    }

    showMessage(); // empty message
    ……或者我们可以使用 || 运算符

    // 如果 "text" 参数被省略或者被传入空字符串,则赋值为 'empty'
    function showMessage(text) {
    text = text || 'empty';
    ...
    }
    现代 JavaScript 引擎支持 空值合并运算符 ??,当可能遇到其他假值时它更有优势,如 0 会被视为正常值不被合并:

    // 如果没有传入 "count" 参数,则显示 "unknown"
    function showCount(count) {
    alert(count ?? "unknown");
    }

    showCount(0); // 0
    showCount(null); // unknown
    showCount(); // unknown

      返回值
    函数可以将一个值返回到调用代码中作为结果

    最简单的例子是将两个值相加的函数:

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

    let result = sum(1, 2);
    alert( result ); // 3
    指令 return 可以在函数的任意位置。当执行到达时,函数停止,并将值返回给调用代码(分配给上述代码中的 result)。

    在一个函数中可能会出现很多次 return。例如:

    function checkAge(age) {
    if (age >= 18) {
    return true;
    } else {
    return confirm('Got a permission from the parents?');
    }
    }

    let age = prompt('How old are you?', 18);

    if ( checkAge(age) ) {
    alert( 'Access granted' );
    } else {
    alert( 'Access denied' );
    }
    只使用 return 但没有返回值也是可行的。但这会导致函数立即退出

    例如:

    function showMovie(age) {
    if ( !checkAge(age) ) {
    return;
    }

    alert( "Showing you the movie" ); // (*)
    // ...
    }
    在上述代码中,如果 checkAge(age) 返回 false,那么 showMovie 将不会运行到 alert。

      函数命名
    函数就是行为(action)。所以它们的名字通常是动词。它应该简短且尽可能准确地描述函数的作用。这样读代码的人就能清楚地知道这个函数的功能。

    一种普遍的做法是用动词前缀来开始一个函数,这个前缀模糊地描述了这个行为。团队内部必须就前缀的含义达成一致。

    例如,以 "show" 开头的函数通常会显示某些内容。

    函数以 XX 开始……

    "get…" —— 返回一个值,
    "calc…" —— 计算某些内容,
    "create…" —— 创建某些内容,
    "check…" —— 检查某些内容并返回 boolean 值,等。
    这类名字的示例:

    showMessage(..) // 显示信息
    getAge(..) // 返回 age(gets it somehow)
    calcSum(..) // 计算求和并返回结果
    createForm(..) // 创建表格(通常会返回它)
    checkPermission(..) // 检查权限并返回 true/false

  • 相关阅读:
    codeforces 1140D(区间dp/思维题)
    区间dp之四边形不等式优化详解及证明
    poj1947
    hdu4044
    poj1155
    poj3162(树形dp+优先队列)
    hdu4003详解(树形dp+多组背包)
    poj1947(树形背包)
    hdu1011(树形背包)(提供一个特殊样例)
    CopyOnWriteArrayList总结
  • 原文地址:https://www.cnblogs.com/perfectdata/p/15398838.html
Copyright © 2011-2022 走看看