& # 39;调用者# 39;和& # 39;参数# 39;是受限制的函数属性,不能在此上下文中访问
'caller' and 'arguments' are restricted function properties and cannot be accessed in this context
我正在尝试创建一个简单的调试函数,它只显示函数的调用者,像这样:
function xe() {
console.log(xe.caller().name)
}
有了这个,我就可以将xe()
添加到一个函数中,它将记录对该函数的调用-只是一个简短的,简单的添加,以帮助调试。可以这么说,调试糖
不幸的是,我从主题行得到了错误:
TypeError: 'caller'和'arguments'是受限制的函数属性,不能在此上下文中访问。
我使用Babel/ES6,它在每个模块的顶部注入"use strict"
。这个可能是原因,但是搜索得到的关于错误产生原因的信息有限,我想更好地理解它。
如果严格模式是问题,我宁愿不禁用严格模式为整个项目-只是为模块/功能。
这是原因。从MDN:
在严格模式下,不再可能通过对ECMAScript的通用实现扩展来"遍历"JavaScript堆栈。在这些扩展的正常代码中,当函数fun正在被调用时,fun。Caller是最近调用fun的函数。参数是调用乐趣的参数。这两个扩展对于"安全"JavaScript来说都是有问题的,因为它们允许"安全"代码访问"特权"函数及其(可能不安全的)参数。如果乐趣处于严格模式,那么两者都是乐趣。来电者和乐趣。参数是不可删除的属性,在设置或检索时抛出:
如果你使用的是ES6,一般情况下你不能禁用严格模式。在某些情况下,例如在ES6模块中,它是隐式的。
如果你只是在调试,我建议在调试器中使用断点并检查堆栈帧,但我相信你已经知道了。
如果你只是输出调试信息,你也可以,我想只是读取一个Error对象的堆栈:
console.log(new Error().stack);
你可以全局禁用(但我意识到这不是你想要的)use strict
与babel使用:
require("6to5").transform("code", { blacklist: ["useStrict"] });
或
$ 6to5 --blacklist useStrict
如果你必须在模块级别上剥离它,我怀疑你必须自己做。也许可以替换基本的字符串?
此外,正如ES5中指出的那样。它应该是xe.caller.name
而不是xe.caller().name
,否则您将重新调用该函数。
按照本文档。Function.caller()
属性返回调用指定函数的函数。简单地说,当您使用xe.caller
时,您将获得整个调用函数。你再次执行调用函数。这里您正在执行递归,这就是在严格模式下不允许的原因。
您可以在浏览器控制台中执行示例函数。你会得到Maximum call stack size exceeded
错误
- IOS自动化:有没有办法;刷新'元素树(或者Instruments'认为可以访问和不能访问的任何内容)
- 为什么我的firefox扩展javascript不能访问opener窗口,也看不到window.name
- 为什么这个 javascript 函数不能访问同一类中的变量
- 为什么我可以在javascript中访问asp:TextBox,但不能访问asp:Label
- 用一个页面创建测试,以确定结果(不能访问数据库或php,需要使用javascript/html/等)
- 不能访问数组中的对象,只能访问对象本身
- Rails-Don'不能访问表单中的实例变量
- js在参数中命名了函数,不能访问出函数
- 为什么我不能访问CoffeeScript中的动态内容选择器
- 扩展了类,但不能访问子类的函数
- 为什么不能访问分配jquery对象的函数内部的变量
- IAM允许访问一个dynamoDB方法,但不能访问另一个使用javascript到AWS的方法
- 解析AJAX HTML响应:我可以找到元素,但不能访问它们的innerHTML或值
- 使用带有jquery/javascript的for循环创建动态数组不能访问外部或不能访问全局
- 不能访问正确的对象位置
- 量角器:不能访问父函数定义的闭包中的变量
- 不能访问ng-repeat项目中的ng-click事件
- 如何将参数传递给回调,而不能访问Javascript中的母函数
- React/Javascript,不能访问对象中的字段
- Chrome.storage.local不能访问其他脚本中的数据