3 函数

ECMAScript 函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。

1 怎么判断传递进来的参数个数呢?

可以用arguments.length获得:

function doAdd(){
    if(arguments.length == 1){
        alert(arguments[0] + 10);
    }else if(arguments.length == 2){
        alert(arguments[0] + arguments[1]);
    }
}
doAdd(10);
doAdd(10,20);

2 分析如下程序的值

function doAdd(num1, num2){
    arguments[1] = 10;
    alert(arguments[0] + num2);
}
doAdd(20, 50);

:arguments对应的值永远与对应的命名参数(形参)的值保持同步,但它们的内存空间(num2和arguments[1])是独立的。

结果为30。

3 创建方式

常见的创建方式有两种:

第一种:

function sum(num1, num2){
    return num1 + num2;
}

第二种:

var sum = function (num1, num2){
    return num1 + num2;
}

函数是对象,每个函数都是 Function 类型的实例,与其他引用类型一样具有属性和方法。

4 作为值调用

在函数内部,有三个特殊的对象: arguments, this, caller

写一个阶乘函数,并打印出5的阶乘结果。

function factorial(num){
    if(num <= 1){
        return 1;
    }else {
        return num * arguments.callee(num - 1);
    }
}
console.log(factorial(5));

5 什么是this?

this : It is a reference to the context object that the function is operating on

var color = "red";
var obj = {color: "blue"};
function sayColor() {
    document.write(this.color + "</br>");
}
sayColor();

比如,上述程序中,函数sayClolor是在全局环境中运行,那么sayClolor中的this指的是window对象。

6 apply()和call()方法

实际上等于设置函数体内 this 对象的值。

var color = "red";
var obj = {color: "blue"};
function sayColor() {
    var color = "green";
    document.write(this.color + "</br>");
}
sayColor();
sayColor.call(obj);

答案是:

red

blue

当运行sayColor.call(obj)时,sayColor的执行环境已经是在对象obj中,这时sayColor函数中的this指向了对象obj,所以,根据作用域链,自然打印的是obj中的color:blue.

apply()和call()作用一样,仅仅是参数有所不同。

注意:使用 call() 或 apply() 来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。

举个例子:有七个对象person,需要打印出各自的姓名。

var name = "father";
var child1 = {name: "A", age:10};
var child2 = {name: "B", age:12};
function sayName() {
    document.write(this.name+"<br>");
}
sayName();
sayName.call(child1);
sayName.call(child2);
原文地址:https://www.cnblogs.com/lijy/p/6602330.html