简单上手 JavaScript 函数Function类型对象 (javascript红皮书二刷 - Ch5.5 Function类型)

本文探讨了JavaScript函数的两种声明方式,作为值传递、参数和返回值的应用,函数对象的arguments和callee属性,this的指向,以及函数的length、prototype、apply、call和bind等特性。了解这些概念有助于提升代码可读性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JS 函数类型和对象

在JS中函数实际上是对象, 每个函数都是 Function 类型的实例, 因此函数名仅是指向函数对象的一个指针。

注意到这一点, 下面的代码就很容易理解了~

声明函数 & 使用表达式声明 👍

这两种方法都是可以进行 函数声明 的:

function sum(a, b) {
	return a + b // method 1
}

var sum = function(a, b) {
	return a + b // method 2
}

另外 JS 中的函数并没有重载, 其原因是函数名只是一个指针。

将函数作为值传递

另一种和值有关, 声明函数的方式 (不常用)

注意到如下代码:

var sum = new Function("a", "b", "return a+b")

将函数作为另一个函数的参数

在 JS 中这也是一种合法的声明函数的方式, 只是不太提倡。那么函数也可以 作为值 成为另一个函数的参数,看代码容易理解:

function calc(some_function, some_arguments) {
	some_function(some_arguments)
}

function add(x) {
	console.log(x+1)
}

calc(add, 2) // 输出 3

将函数作为另一个函数的返回值

同理, 函数也可以作为函数的 return值, 在特定的场景下使用有奇效~

函数对象的 内部属性

arguments 的特殊属性 callee 👍

虽然 arguments 包含着传入数组的所有 参数, 但是他还有一个特殊的属性 callee, 作用是指向这个函数对象本身, 在函数需要调用自己时, 常使用它进行解耦, 例如:

fun sum(x) {
	if (x == 0) return 0
	return 1 + sum(x - 1)
}

var vjiasdjf = sum
vjiasdjf(10)

此时 vjiasdjf 内部仍会调用 sum, 不利于代码的健壮运行, 使用 callee 的写法是:

fun sum(x){
	if (x == 0) return 0
	return 1 + arguments.callee(x - 1)
}

this 指向运行环境的指针

this 引用了函数数据执行的运行环境对象, 例如在全局作用域中执行, 指向的是 window 对象, 此时对 this.color 进行操作, 就是对 window.color 进行操作。

函数属性和方法

length 函数希望接受的参数数量

比较简单的特性, 代码如下:

function getName(){}
function sum(a, b){}

console.log(getName.length) // 为 0
console.log(sum.length) // 为 2

prototype 函数原型

函数中的 prototype 保存了它的实例方法, 创建自定义引用类型和实现继承的关键所在, 将在后续的文章中详解~

apply() 在特定作用域调用函数

apply() 函数用于设置函数特定的作用域, 可以类似理解为设置 this 对象的值。使用方法为:

function sum(a, b) {
	return a + b
}

function callSum(a, b) {
	sum.apply(this, arguments)
}

sum.apply(this, [1, 2])
callSum(1, 2) // 这两种方法都是合法的

call() 传递参数方式不同的apply

apply() 使用的是 arguments 对象或者一个包含所有参数的 Array, 有时需要直接进行一一对应的参数传递, 那么使用 call() 更合适:

function sum(a, b) {
	return a + b
}

sum.call(this, 1, 2)

bind() 复制一份特定作用域的函数实例

这是 ES5 的特性, 可以通过这个方法来创造一个特定作用域的函数实例, 通过代码理解:

value = 1
var obj = { value: 10 }

function showValue(){ console.log(this.value) }
var bindShowValue = showValue.bind(obj)

bindShowValue() // 输出 10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值