优秀的编程知识分享平台

网站首页 > 技术文章 正文

javascript自学记录:Function类型

nanyue 2024-08-17 19:10:29 技术文章 69 ℃


5.5 Function类型

函数名是指向函数对象的指针

1)、两种定义方式:

// 定义方式1
function sum(num1,num2) {
    return num1 + num2;
}

// 定义方式2
var sum = function (num1,num2) {
    return num1 + num2;
};

由于第二种定义方式是语句,所以在最后结尾处有加分号;

2)、图解函数名与对象的关系


3)、没有重载

函数没有重载,指的是多次定义函数时,后面定义的会覆盖前面的定义。对于有重载的,个人理解为如果出现多次定义就会提示出错;不提示出错就没有重载。

4)、函数声明与函数表达式

函数声明是这样的:

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

函数表达式是这样的:

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

对于函数声明,无论声明的语句在哪,系统都会先读入,再使用。所以声明语句可以在引用之后。

函数表达式就不同了,必须要先运行了该表达式,之后才能用引。

5.5.3 将函数作为值

function sum(num) {
    return num + 10;
}
function callFunction(someFunction,someArgument) {
    return someFunction(someArgument);
}

var res = callFunction(sum,1);
document.write(res);    // 10 + 1

实际上是将两个函数嵌套在一起了:

function callFunction(someFunction,someArgument) {
    return function sum(num) {
        return num + 10;
    };
}

对于多层次数据进行的排序,可采用下面的代码:

function createComparisonFunction(属性名) {
    return function (obj1,obj2) {
        var val1 = obj1[属性名];
        var val2 = obj2[属性名];

        if (val1 < val2){
            return -1;
        } else if (val1 > val2){
            return 1;
        } else {
            return 0;
        }
    };
}
var data = [{name:"zachary",age:28},{name:"nicholas",age:29}];
data.sort(createComparisonFunction("name"));
alert(data[0].name);    // nocholas

data.sort(createComparisonFunction("age"));
alert(data[0].name);    // zachary

虽然这个代码不熟悉,但在其他语言中也见过,这个感觉比较重要,要用到的时候再来搜索。

5.5.4 函数内部的属性

1)、arguments.callee:代表拥有arguments对象的函数。

首先创建了以下的阶乘函数:

function 阶乘(n){
    if (n <= 1){
        return 1;
    }else {
        return n * 阶乘(n-1);
    }
}
document.write(阶乘(5));  // 120

上述阶乘函数有两处用到了函数名,如果将外部函数名改为factorial,那么内部没有变化,调用的还是名为阶乘的函数,这样就是紧密耦合。

将内部的阶乘改为arguments.callee:

function factorial(n){
    if (n <= 1){
        return 1;
    }else {
        return n * arguments.callee(n-1);
    }
}
document.write(factorial(5));

这个过程是能看明白的,但却意外地没运行成功,在callee出现了红色波浪线,显示出了这个错误:referencing 'claller' and 'callee' from arguments is not allowed.(注:因为代码中用了use strict)

2)、this

在不同的环境指代不同对象。

Tags:

最近发表
标签列表