'caller' 和 'arguments' 是受限函数属性,无法在此上下文中访问
'caller' and 'arguments' are restricted function properties and cannot be accessed in this context
我正在尝试创建一个简单的调试函数,它只显示函数的调用者,如下所示:
function xe() {
console.log(xe.caller().name)
}
有了这个,我就可以将 xe()
添加到一个函数,它会记录对该函数的调用——只是一个简短的添加来帮助调试。调试糖,可以这么说。
不幸的是,我从主题行中得到了错误:
TypeError: 'caller' and 'arguments' are restricted function properties and cannot be accessed in this context.
我正在使用 Babel/ES6,它在每个模块的顶部注入 "use strict"
。这个可能是原因,但是搜索得到的关于为什么会出现错误的信息有限,我想更好地理解它。
如果严格模式是问题所在,我宁愿不为整个项目禁用严格模式——仅针对 module/function.
是这个原因。 From MDN:
in strict mode it's no longer possible to "walk" the JavaScript stack via commonly-implemented extensions to ECMAScript. In normal code with these extensions, when a function fun is in the middle of being called, fun.caller is the function that most recently called fun, and fun.arguments are the arguments for that invocation of fun. Both extensions are problematic for "secure" JavaScript because they allow "secured" code to access "privileged" functions and their (potentially unsecured) arguments. If fun is in strict mode, both fun.caller and fun.arguments are non-deletable properties which throw when set or retrieved:
如果你在做 ES6,一般情况下你不能禁用严格模式。它在 期间是隐含的,例如在 ES6 模块中。
如果您只是调试,我建议您只在调试器中使用断点并检查堆栈帧,但我相信您已经知道了。
如果你只是输出调试信息你也可以,我想只是读取错误对象的堆栈:
console.log(new Error().stack);
你可以 globaly disable(但我知道这不是你想要的)use strict
和 babel 使用:
require("6to5").transform("code", { blacklist: ["useStrict"] });
或
$ 6to5 --blacklist useStrict
如果您必须在模块级别将其删除,我想您必须自己动手。也许基本字符串替换?
此外,正如在 ES5 中指出的那样。它应该是 xe.caller.name
而不是 xe.caller().name
否则您将重新调用该函数。
根据 this 文档。 Function.caller()
属性 returns 调用指定函数的函数。当您使用 xe.caller
时,您将获得完整的调用函数。您再次执行调用函数。在这里你正在做 递归 这就是它不允许在严格模式下的原因。
您可以在浏览器控制台中执行示例函数。你会得到 Maximum call stack size exceeded
错误。
我正在尝试创建一个简单的调试函数,它只显示函数的调用者,如下所示:
function xe() {
console.log(xe.caller().name)
}
有了这个,我就可以将 xe()
添加到一个函数,它会记录对该函数的调用——只是一个简短的添加来帮助调试。调试糖,可以这么说。
不幸的是,我从主题行中得到了错误:
TypeError: 'caller' and 'arguments' are restricted function properties and cannot be accessed in this context.
我正在使用 Babel/ES6,它在每个模块的顶部注入 "use strict"
。这个可能是原因,但是搜索得到的关于为什么会出现错误的信息有限,我想更好地理解它。
如果严格模式是问题所在,我宁愿不为整个项目禁用严格模式——仅针对 module/function.
是这个原因。 From MDN:
in strict mode it's no longer possible to "walk" the JavaScript stack via commonly-implemented extensions to ECMAScript. In normal code with these extensions, when a function fun is in the middle of being called, fun.caller is the function that most recently called fun, and fun.arguments are the arguments for that invocation of fun. Both extensions are problematic for "secure" JavaScript because they allow "secured" code to access "privileged" functions and their (potentially unsecured) arguments. If fun is in strict mode, both fun.caller and fun.arguments are non-deletable properties which throw when set or retrieved:
如果你在做 ES6,一般情况下你不能禁用严格模式。它在
如果您只是调试,我建议您只在调试器中使用断点并检查堆栈帧,但我相信您已经知道了。
如果你只是输出调试信息你也可以,我想只是读取错误对象的堆栈:
console.log(new Error().stack);
你可以 globaly disable(但我知道这不是你想要的)use strict
和 babel 使用:
require("6to5").transform("code", { blacklist: ["useStrict"] });
或
$ 6to5 --blacklist useStrict
如果您必须在模块级别将其删除,我想您必须自己动手。也许基本字符串替换?
此外,正如在 ES5 中指出的那样。它应该是 xe.caller.name
而不是 xe.caller().name
否则您将重新调用该函数。
根据 this 文档。 Function.caller()
属性 returns 调用指定函数的函数。当您使用 xe.caller
时,您将获得完整的调用函数。您再次执行调用函数。在这里你正在做 递归 这就是它不允许在严格模式下的原因。
您可以在浏览器控制台中执行示例函数。你会得到 Maximum call stack size exceeded
错误。