关于JavaScript中argument.caller的理解问题!谢谢!

我想问的是,怎么分清了argument.caller和函数的caller属性,还有为什么第三方代码就不能在相同的环境里窥视其它代码了!谢谢!
最新回答
猫吻

2026-10-22 09:07:55

    首先要分清caller和callee,arguments.callee返回当前正在执行的函数,function.caller返回函数的调用体所在函数。

随便弄了个示例代码

function parentCheck() {
    check("");
    function check() {
        subCheck();
        function subCheck() {
            console.log(arguments.callee);
            console.log(subCheck.caller.caller)
        }
    }
}
parentCheck();

    arguments.callee返回subCheck的函数体,subCheck.caller返回调用subCheck的函数,即check,而再往上一层,subCheck.caller.caller就是返回调用check的函数体,也就是parentCheck。那如果是继续往上一层呢?subCheck.caller.caller.caller?就会变成null。书里也有讲,arguments.caller在非严格模式下永远是undefined。我们就可以判断值是null还是undefined来区分arguments.caller和函数的caller。

    JS的函数是可以无限嵌套的,就构成了一棵树,而function.caller就提供了一个访问父节点的方法,通过灵活应用function.caller,我们甚至可以用脚本画出整棵树,只要我们在任意地方成功插入一段JS代码,又或者是,像网站统计之类的第三方代码,我们就能窥视其他代码。

    所以为了安全期间,严格模式禁止调用caller、callee、arguments变量,在浏览器中的报错为

Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

个人敝见,无书可循,希望对您有帮助

野港

2026-08-18 06:51:48

是arguments.callee,你都打错了