• 《JavaScript高级程序设计》读书笔记(三)基本概念第六小节理解函数


    内容
    ---语法
    ---数据类型
    ---流程控制语句 上一小节
    ---理解函数 本小节


    函数
    --使用function关键字声明,后跟一组参数以及函数体

    function functionName(arg0, arg1,..., argN) {
        statements;
    }

    例如

    function sayHi(name, message) {
        console.log("Hello " + name + ", " + message);
    }

    --通过函数名来调用,后面加上圆括号和参数

    sayHi("luking", "how are you today?");
    //Hello luking, how are you today?

    --不必指定返回值,

    --使用return语句后跟返回值,来实现返回值

    function sum(num1, num2) {
        return num1 + num2;
    }
    sum(1,2); //3

    --执行完return语句后函数停止并立即退出

    --可以使用条件语句来添加多个return 情况

    function diff(num1, num2) {
        if(num1 < num2) {
            return num2 - num1;
        } else {
            return num1 - num2;
        }
    }

    --return语句也可以不带返回值

    --此时返回undefined
    --用于需要提前停止函数执行而又不需要返回值的情况

    function do(num) {
        if(num > 5) {
            return;
        }
        console.log("this is " + num);
    }
    do(3); //控制台输出:this is 3
    do(6); //

    --推荐做法

    --要么让函数始终有返回值
    --要么始终没有
    --方便调试代码


    理解参数
    --ECMAScript函数的参数不同于大多数强语言
    --不介意参数的类型
    --也不介意是否多传,少传参数
    --因为ECMAScript的参数在内部是用一个数组来表示的
    --函数接受的始终是这个数组

    --函数体内可以通过arguments对象来访问这个参数数组
    --从而获得传递给函数的每一个参数
    --arguments对象和数组类似
    --可以用arguments[index] 来访问参数
    --通过访问arguments.length属性返回传递的参数的个数

    function doAdd(num1, num2) {
        if(arguments.length == 1) {
            return num1 + 10;
        } else if(arguments.length == 2) {
            return num1 + num2;
        } else {
            return 0;
        }
    }
    doAdd(10);         //20
    doAdd(10, 20);     //30
    doAdd();         //0

    --arguments访问的参数值和命名参数保持一致

    --修改arguments的值,会自动反应到对应的命名参数中,
    --但是修改命名参数的值,不会改变arguments的值

    function doAdd(num1, num2) {
        arguments[1] = 10;
        return num1 + num2;
    }
    doAdd(10,20); //20

    --如果只传一个参数,此时修改arguments[1],

    --不会反应到命名参数中,无法改变num2的值
    --因为arguments对象的长度由传入的参数个数决定
    --不是由定义函数时的命名参数的个数决定
    --没有传递值的命名参数将自动被赋予undefined

    --严格模式下修改arguments的值,无法反应到命名参数中

    --ECMAScript中的所有参数传递都是值传递,不可能通过引用传递参数
    --包括引用类型,也只是传递了所引用的值,而不是参数本身的引用
    --通过传递的引用的值可以修改引用类型的值
    --但是无法修改参数本身的引用

    function f(x) {
        x[0] = 1;
        x = new Array();
        x[0] = 2;
        x[1] = 3;
    }
    var a = [0, 1, 2];
    f(a);
    a; //1,1,2

    没有重载
    --重载;方法名一样,参数类型和个数不同(两个定义的签名)
    --ECMAScript函数没有签名
    --而是由包含零个或者多个值的数组来表示的
    --真正的重载是不可能做到的
    --定义相同名字的方法前者会被后者覆盖掉
    --通过检查传入函数中参数的类型和数量做出不同的反应,可以模仿重载

     

  • 相关阅读:
    [求助] win7 x64 封装 出现 Administrator.xxxxx 的问题
    [经验] Win7减肥攻略(删文件不删功能、简化优化系统不简优化性能)
    [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥)
    [经验] 新版SkyIAR、Easy Image X在有些PE里不能运行的解决办法
    [教程] [承風雅傳HSU]用ES4封裝Win7---ES4 Win7封裝教程(未完待續)
    [讨论] 这几天来封装Win7用户配置文件丢失的解决方法个人心得
    [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装
    [分享] 封装工具ES4配置文件解释
    [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)
    [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )
  • 原文地址:https://www.cnblogs.com/loveluking/p/9432107.html
Copyright © 2020-2023  润新知