zoukankan      html  css  js  c++  java
  • js中的caller属性和callee属性

    应该用“属性”来称呼caller和callee,而不是方法。

    caller:返回调用当前函数的函数的引用。a调用b,则返回a(a是boss,因为a把b叫过去干活了);

    callee: 这个属性中保存b(b是被叫过去差遣的)。返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。

    如果函数是由 Javascript 程序的顶层调用的,那么 caller 包含的就是 null 。(全局作用域中调用,值为null)

    --但是callee属性有什么用处呢??

    1.判断形参长度和实参长度是否一致。

      arguments.length是实参长度,arguments.callee.length是形参长度,由此可以判断调用时形参长度是否和实参长度一致。(该属性仅当相关函数正在执行时才可用。)

        //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)
        }

    2.比较一般的递归函数

        var sum = function(n) {
            if (1 == n)
                return 1;
            else
                return n + sum(n - 1);
        }

      alert(sum(100))

      函数内部包含了对sum自身的引用,函数名仅仅是一个变量名,在函数内部调用sum即相当于调用了一个全局变量,不能很好地体现出是调用自身。这时使用callee会是一个比较好的办法。

    3.有利于匿名函数的递归或者保证函数的封装性(暂不理解)

    caller属性的用法:

        function callerDemo() {
            if (arguments.caller) {
                var a = callerDemo.caller.toString();
                alert(a);
            } else {
                alert("this is a top function");
            }
        }
        function handleCaller() {
            callerDemo();
        }
        handleCaller();
    function calleeDemo() { alert(arguments.callee); } calleeDemo();
  • 相关阅读:
    改进的二分查找
    关于Java并发编程的总结和思考
    java异常捕获案例,此题的出处是《Java编程思想》一书
    一道关于int和Integer的面试题
    看《韩顺平Java》视频的笔记
    spring task 定时任务执行两次
    记录
    Java基础面试题
    TeamViewer修改绑定设备
    jqGrid常用操作
  • 原文地址:https://www.cnblogs.com/n2meetu/p/6728527.html
Copyright © 2011-2022 走看看