首页
HTML+CSS
JavaScript
Vue
WordPress
WP Functions
注册/登录
首页 > JavaScript > 正文

JS:callee 和 caller

在之前的文章中我说到了arguments,现在来说一下他的属性callee和一个长得相似的双胞胎弟弟caller:

一、callee

首先说callee,来一段代码:

var a = function(){
    console.log(arguments.callee);
}
var b = function(){
    a()
}
b();

这段代码在chrome中输出的是:

ƒ () {
    console.log(arguments.callee);
}

这个函数和a函数是不是一模一样?

callee返回正在执行的函数本身的引用。callee是arguments的一个属性,这个属性是一个指针,指向这个拥有arguments对象的函数,(arguments是调用函数,那么这个callee就是调用函数的啦)

首先我们来说一个用callee解决的例子,阶乘的计算:

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

上面的代码是用的是函数名。上述方法会增强耦合性,为了降低耦合性我们就用callee,而且无论引用函数的时候是什么名字都可以完成递归调用。看看callee:

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

console.log(factorial(5));

二、caller

caller:和他相似的我们还有一个caller,es5中规范化了另外一个函数对象属性caller;这个属性中保存着调用当前的函数的函数引用,如果是全局作用于中调用当前的函数就返回null

function outer(){
    inner();
}
function inner(){
    alert(arguments.callee.caller);
    alert(inner.caller)
    //上面的这两行是一样的1比2 的耦合性更松散
    alert(arguments.caller); //undefined
    //这行代码在严格模式下会报错,但是非严格模式下就是undefined
}
outer();
//说是定义argumnets.callee属性是为了分清qrguments.caller和caller
//属性严格模式下不能为caller属性赋值,不然报错
//定义一个函数。里面输出a.caller
var a = function() {
    alert(a.caller);
};

//定义一个函数调用那个a函数;
var b = function() {
    a();
}
b();	//输出b函数。

上面的例子中,是调用的b根据caller的特性就知道了答案。

var a=function(){
    alert(a.caller);		
} //定义一个函数。里面输出a.caller

var b=function(){
    a();
} //定义一个函数调用那个a函数;

a(); //null(a在任何函数中被调用,即为顶层函数,输出的就是null),上面的例子一中,a函数是在b中调用的所以不是顶层不反悔null,返回当前的调用就是b函数啦,而这个例子是在全局中调用的自然是nullx

最后一个例子帮助深刻地理解顶层:要是a中也有了一个函数

var c=function(){
    alert(c.caller);
}
var a=function(){
    c()
    alert(a.caller);
}
var b=function(){
    a();
}
a();

这个例子在c中的alert出来的是a函数,原因是在a中调用。

a中alert出来的是null,毕竟你是在全局中调用的a的函数。b函数相当于没有用。




				
展开全部
分享到:
上一篇:JS:arguments对象
下一篇:JS:深度克隆

网友评论comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

暂无评论

Copyright © 2012-2013 Weesh Net Media
扫二维码
扫二维码
返回顶部