JavaScript中的方法(Function类型)

Function

函数是 ES 中非常重要的一部分,函数实际上也是对象。
每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。
由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会跟某个函数绑定。


定义函数

函数定义有三种方式:
一 函数声明语法

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

二 函数表达式

// 末尾有分号,像
var sum = function(num1, num2) {
	return num1 + num2;
};

三 构造函数(不推荐)

// 这种语法会导致两次解析代码,影响性能
var sum = new Function("num1", "num2", "return num1+num2");

没有重载(重点)

将函数名想象成指针,有利于我们理解为什么 ES 中没有函数重载的概念。
在下面这个例子中,声明了两个同名函数,结果则是后面的函数覆盖了前面的函数。实际上,在创建第二个函数时,覆盖了引用第一个函数的变量 add。

function add(num) {
	return num + 100;
}
function add(num) {
	return num + 200;
}
var result = add(100); 	// 300

函数声明与函数表达式的区别

函数声明与函数表达式定义函数看似相同,实际上在解析器向执行环境中加载数据时,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到他所在的代码行,才会真正被解释执行。

换句话说,就是通过函数声明定义的函数,可以在任何位置调用(声明前和声明后);而通过函数表达式定义的函数,只能在表达式之后调用,之前调用会报错(因为还没被解析器执行)。

alert(sum(10, 10));	// 20
function sum(num1, num2){
	return num1 + num2;
}

// Uncaught TypeError: sum2 is not a function
alert(sum2(10, 10));
var sum2 = function(num1, num2){
	return num1 + num2;
};

函数作为值

因为 ES 中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,也可以将函数作为另一个函数的结果返回。

理解上面的这段话是很有必要的,这两种方式都可以让我们更有效的解决一些特定的问题。

1. 函数作为参数
// 可以用来调用一个函数并给它传递一个参数,来获得第一个返回值。
function callSomeFunction(someFunction, someArgument){
    return someFunction(someArgument);
}

function add(num) {
    return num + 10;
}
function get(str) {
    return "hello," + str; 
}

var result = callSomeFunction(add, 20);
var string = callSomeFunction(get, "talon");
alert(result);  // 30
alert(string);  // hello,talon
2. 函数作为返回值

将函数作为返回值也是非常有用的,比如我们在使用 sort ( ) 方法来按照对象的某个属性排序时,要给 sort ( ) 传递的参数函数就有很多种,而使用将函数作为返回值的方法就可以解决这个问题。

function createComparisonFunction(propertyName) {

    return function(obj1, obj2) {
        var value1 = obj1[propertyName];
        var value2 = obj2[propertyName];
        if(value1 < value2) {
            return -1;
        } else if (value1 > value2) {
            return 1;
        } else {
            return 0;
        }
    };
}

var data = [
    {name: "talon", age: 20},
    {name: "zjaya", age: 19}
];

// 按 name 属性排序
data.sort(createComparisonFunction("name"));
alert(data[0].name) // talon
// 按 age 属性排序
data.sort(createComparisonFunction("age"));
alert(data[0].name) // zjaya

猜你喜欢

转载自blog.csdn.net/TalonZhang/article/details/84977776
今日推荐