文章目录
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