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

 

 

posted @ 2018-08-06 19:26  Luking  阅读(128)  评论(0编辑  收藏  举报