关于JavaScript中argument.caller的理解问题!谢谢! 10
首先要分清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
个人敝见,无书可循,希望对您有帮助
2015-01-10