已合作成功的客户
遍及全国及海外
中国
杭州,绍兴,宁波,湖州,嘉兴,温州,台州,上海,北京,南京,苏州,常州,无锡,长沙,青岛,江西,台湾,南宁,海南,成都,哈尔滨,深圳,香港,沈阳 ...
海外
美国,加拿大,丹麦,澳大利亚,新加坡,法国,智利,日本,英国 ...
合作咨询
4001-355-360
JS Function 属性:函数不只是代码块
作者:admin
来源:lanyunwork
时间:2026-04-08
分享到:
在 JavaScript 里,函数是一种特殊的对象。这意味着函数除了能执行代码,还可以像普通对象一样拥有自己的属性和方法。理解函数自带的那些内置属性和方法,能帮开发者更灵活地控制函数的行为,也能写出更简洁的代码。
函数的 length 属性
每个函数都有一个 length 属性。这个属性返回的是函数定义时声明的参数个数。需要注意的是,它只统计函数定义中明确写出来的形参数量,不包括使用剩余参数 ...args 收集的那些参数。在函数内部,还可以通过 arguments 对象获取实际传入的参数个数,但 arguments 不是函数的属性,而是函数内部的一个局部变量。
length 属性在某些高阶函数中比较有用,比如根据传入函数的参数数量来决定不同的处理逻辑。
函数的 name 属性
name 属性返回函数的名称。对于使用 function 关键字声明的函数,name 就是定义时的函数名。对于赋值给变量的匿名函数,name 会是变量名。对于通过 Function 构造函数创建的函数,name 是 anonymous。
name 属性在调试时很有帮助,当查看调用栈或打印函数时,能看到函数的具体名称,而不是显示 anonymous。在一些框架或库的日志系统中,也会利用 name 属性来生成更友好的调试信息。
函数的 prototype 属性
只有通过 function 关键字声明的普通函数,才拥有 prototype 属性。箭头函数和简写方法没有这个属性。prototype 是一个普通对象,当这个函数被用作构造函数(也就是通过 new 关键字调用)时,生成的新实例的原型会指向这个 prototype 对象。
这个属性是实现基于原型的继承的核心机制。在 prototype 上添加的方法和属性,会被所有通过该构造函数创建出来的实例共享。日常开发中,经常会在构造函数的 prototype 上定义方法,这样每个实例不用单独复制一份方法,可以节省内存。
apply 和 call 方法
apply 和 call 的作用是一样的,都是在调用函数的同时,手动指定函数内部的 this 指向。区别在于传递参数的方式不同。call 需要把参数一个一个列举出来,而 apply 要求把参数放在一个数组或类数组对象里。
这两个方法在需要借用其他对象的方法时很有用。比如一个对象没有某个方法,但另一个对象有,就可以通过 call 或 apply 以当前对象的名义去调用那个方法。另外在继承模式中,也经常用 call 来调用父类的构造函数。
bind 方法
bind 和 apply、call 有些类似,都是用来绑定 this 的。但 bind 不会立即执行函数,而是返回一个新的函数。这个新函数的 this 被永久绑定到了指定的对象上,无论后续怎么调用都不会改变。部分参数也可以预先传入,这个操作叫做偏函数。
bind 在事件处理、定时器回调这类场景中比较常用。因为在这些场景下,函数被调用时的 this 往往不是预期的对象,提前用 bind 绑定好,可以避免出现 this 指向错误的问题。
toString 方法
函数的 toString 方法会返回函数的源代码字符串。对于原生内置函数,比如 Array.prototype.map,toString 返回的一般是 function 开头的原生代码占位符。对于自定义函数,返回的就是定义时的完整代码。
这个方法的实际用途不算太多,但在某些调试场景或需要动态分析函数内容的场景下可能会用到。一些在线代码编辑器或调试工具,也会利用 toString 来展示函数的具体实现。
函数自身的自定义属性
因为函数是对象,所以可以给函数直接添加自定义属性。这种属性不会出现在函数的原型链上,而是作为函数对象自己的属性存在。这种特性可以用来存储一些与函数本身相关的状态,比如记录函数被调用的次数,或者给函数挂载配置项。
和全局变量相比,把状态挂在函数自身属性上可以避免污染全局作用域,同时又能保持状态的持久化。这种写法虽然不常用,但在某些需要自记忆的函数场景下是挺干净的方案。
总结
JavaScript 的函数附带了一系列内置属性和方法。length 和 name 提供函数的元信息,prototype 支撑基于原型的继承体系,apply、call 和 bind 提供了灵活控制 this 的能力,toString 则可以查看函数的源码。这些功能组合在一起,让函数不再是简单的可执行代码块,而是一种功能更丰富、可以参与各种复杂逻辑调用的对象。
获取方案