javascript中的callee、caller、call、apply、bind的用法与区别

说实话,这些在平日开发用的真不是很多,一般都是面试会碰到,不过肯定也要去了解和知道,这里就简单的讲下其中的一些技巧型用法和区别。

callee

返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。

callee其实就是返回当前调用的函数本身,一般有以下用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//callee可以打印其本身
function calleeDemo() {
alert(arguments.callee);
}
//用于验证参数
function calleeLengthDemo(arg1, arg2) {
if (arguments.length == arguments.callee.length) {
window.alert("验证形参和实参长度正确!");
return;
} else {
alert("实参长度:" + arguments.length);
alert("形参长度: " + arguments.callee.length);
}
}
//递归计算
var sum = function (n) {
if (n < = 0)
return 1;
else
return n +arguments.callee(n - 1)
}

caller

caller返回一个对函数的引用,该函数调用了当前函数。
对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 Javascript 程序的顶层调用的,那么 caller 包含的就是 null 。

caller就是返回当前函数的调用者,可以理解为它是被哪个函数内部调用的,那么返回的就是那个调用者的函数本身,常用的有:

1
2
3
4
5
6
7
8
9
function callerDemo() {
console.log(arguments.callee.caller)
}
callerDemo() // null
function handleCaller() {
callerDemo();
}
handleCaller() // function handleCaller() { callerDemo() }

需要注意的是: 在严格模式下,callee,caller都是禁止使用的,包括arguments也有部分限制。

1
2
3
4
5
6
7
8
9
function callerDemo(){
"use strict"
console.log(arguments.callee.caller)
}
foo()
VM340:3 Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
at callerDemo (<anonymous>:3:23)
at <anonymous>:1:1

call

call() 方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。

call()方法就是用来改变上下文,也就是this对象,该方法的作用和 apply() 方法类似,只有一个区别,就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组。常见的用法有:

1
[].slice.call(arguments) // 实参转换数组 方便后续调用数组的方法

apply

apply() 方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。

apply()方法也是改变上下文,第一个参数同为this对象,剩下的参数和call()相反,apply()接受一个数组。常见的用法有:

1
2
3
4
5
6
Math.max.apply([1,2,3]) // 3 求最大值
Math.min.apply([1,2,3]) // 1 求最小值
var arr1 = [1,2,3], arr2 = [4,5]
Array.prototype.push.apply(arr1, arr2)
console.log(arr1) // [1,2,3,4,5] push一整个数组

bind

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

bind()方法的和call()apply()一样都是改变上下文,其参数形式,也和call()相同,但是不同的是call()apply()返回值是函数调用的结果,而bind()是返回函数本身,当返回的新函数被调用时,就会修改其this对象。其实这也是柯里化(currying)的实现,柯里化的优点之一就是延迟返回,bind()方法正是如此。

菜鸟学习笔记,如有不对,还希望高手指点。如有造成误解,还希望多多谅解。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。