JavaScript Function类型 小抄
发布日期:2021-05-16 17:58:09 浏览次数:18 分类:精选文章

本文共 2495 字,大约阅读时间需要 8 分钟。

ECMAScript 函数类型深入解析

ECMAScript 中,函数是最有趣的对象之一。任何函数都是一个 function 对象的实例,既有属性又有方法。这意味着函数名实际上只是指向 function 对象的变量指针,不会因为名字改变而影响函数本身。

函数的声明

函数声明语法

函数可以通过 function 关键字声明:

function sum(sum1, sum2) {    return sum1 + sum2;}

或者用函数表达式定义:

var sum = function(sum1, sum2) {    return sum1 + sum2;}

还可以用构造函数定义:

var sum = new Function("sum1", "sum2", "return sum2 + sum1"); // 不推荐使用

由于函数名只是指针变量,即使重命名也不会真正重载函数,因为函数名是一个变量,只是指向函数对象的新值。

函数声明与解析

函数声明与函数表达式的区别在于声明时函数对象会立即被添加到执行环境中,而函数表达式只有在调用时才被解析。

函数作为值的使用

函数名本身是变量,因此函数也可以作为值使用。除了传递给其他函数,函数还能作为返回值:

// 比较对象属性function createComparFun(propertyName) {    return function(object1, object2) {        var value1 = object1[propertyName];        var value2 = object2[propertyName];        if (value1 < value2) return -1;        if (value1 > value2) return 1;        return 0;    };}var data = [{ name: "zachary", age: 28 }, { name: "Nicholas", age: 29 }];data.sort(createComparFun("name"));alert(data[0].name);data.sort(createComparFun("age"));alert(data[0].name);

函数内部属性

函数内部有两个特殊对象:

  • arguments:是一个类数组对象,包含所有传入函数的参数。
  • this:引用函数执行时的作用域对象。

arguments 对象

arguments 有一个特殊属性 callee,指向定义该 arguments 对象的函数。

function factorial(num) {    if (num <= 1) return 1;    return num * factorial(num - 1);}

传统方式调用可能会因为函数名改变而失败,但可以使用 arguments.callee 实现安全递归:

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

this 对象

this 的行为与 Java、C# 等类似,表示调用函数的环境对象。例如:

// 全局调用window.color = "red";var o = { color: "blue" };function sayColor() {    return this.color;}o.sayColor = sayColor;// 全局调用 this 是 windowalert(sayColor());// 对 o 调用 sayColor this 是 oalert(o.sayColor());

函数的属性与方法

每个函数有以下属性:

  • length:表示命名参数的个数。
  • prototype:用以存储实例方法,通过 toString() 或 valueOf() 访问。

函数还具有两个内置方法:

  • apply()call():用于在特定作用域中执行函数。
  • bind():将 this 绑定到指定对象。

基本使用示例

function sum(num1, num2) {    return num1 + num2;}function callSum(number1, number2) {    return sum.apply(this, arguments); // apply 接受执行函数的作用域和参数数组}function callAgain(num1, num2) {    return sum.call(this, num1, num2);}// 确保 call 的参数被逐个传递alert(callSum(100,99)); // 199alert(callAgain(800, 200)); // 1000

使用 call() 和 apply()

window.color = "red";var o = { color: "blue" };function sayColor() {    alert(this.color);}// 全局调用sayColor(); // this 是 window,输出 redsayColor.call(this); // 输出 redsayColor.call(o); // 输出 blue// 使用 bind 绑定 thisvar TheSayColor = sayColor.bind(o);TheSayColor(); // 输出 blue

通过 call() 和 apply(),我们可以灵活管理函数的执行作用域,而无需将函数加入对象中。

总结

通过以上介绍,我们知道函数在 ECMAScript 中具有多种功能和应用方式。理解了函数的基本特性及其使用方法,我们可以更高效地编写和优化代码。

上一篇:判断浏览器是否为 IE11
下一篇:JavaScript-变量、作用域、内存 小抄

发表评论

最新留言

不错!
[***.144.177.141]2025年05月07日 05时43分51秒