Function 类型(上)
函数是对象,函数名仅仅是指向函数对象的指针;
生僻知识点:使用
Function构造函数定义函数参数 任意多个,最后一个参数被视为函数体
var sum = new Function('num1', 'num2', 'num3', 'return num1 + num2 + num3'); sum(1, 2, 3); // 6
使用构造函数定义函数优缺点
- 优点:直观,服从“函数是对象,函数名是指针”的原则
- 缺点:导致两次解析,影响性能
没有重载
- 松散的
ES中的函数没有函数签名的概念,也就没有重载; 见链接:Functions
函数声明与函数表达式
// 函数声明
alert(sum(1, 1)); // 2
function sum(num1, num2) {
return num1 + num2;
}
// 函数表达式
alert(sum(1, 2)); // sum is not a function
var sum = function (num1, num2) {
return num1 + num2;
}
function declaration hoisting-- 函数声明提升;JavaScript引擎优先处理函数声明,提升至源代码的顶部;函数表达式只会发生变量提升。
作为值的函数 -- 以变量的眼光看
函数名本身即是变量,函数可以方便作为普通类型值使用,可以作为参数传递给另一个函数;
function callSomeFunction (someFunction, someArgument) { return someFunction(someArgument); }可以 将一个函数作为另一个函数的返回值返回,这是一种极为有用的技术
// 目的:依据数组内对象的某个属性进行数组对象项的排序 var person1 = { name: 'liuhq3', age: 21 } var person2 = { name: 'yangfch3', age: 20 } var person = [person1, person2]; // [Object, Object] function createComparisonFunction(propertyName) { // object1 object2 是数组中的每一个对象项 return function (object1, object2) { var value1 = object1[propertyName]; var value2 = object2[propertyName]; /* * 下面的 if 可简写为: * return value1 - value2; * 即可 */ if (value1 < value2) { return -1; } else if (value1 > value2) { return 1 } else { return 0; } } } // 创建一个依据 age 排序的比较函数; person.sort(createComparisonFunction('age')); // [person2, person1] person.sort(createComparisonFunction('age')); // [person2, person1]上面的代码展示了:我们可以很方便地根据数组项对象的不同属性进行排序