【问题标题】:Is it possible to say node-compiler ignore the strict mode for a while?是否可以说节点编译器暂时忽略严格模式?
【发布时间】:2017-12-26 16:01:08
【问题描述】:

第一个按预期工作:

var f1 = Object.getOwnPropertyNames(Function)
    .forEach(function(element) {
         console.log (typeof Function[element]);
    });  //  --> number, string, function

第二个输出错误信息:

var f2 = Object.getOwnPropertyNames(Function.prototype)
    .forEach(function(element) {
        console.log (typeof Function.prototype[element]);
});

TypeError: 'caller'、'callee' 和 'arguments' 属性可能无法在严格模式下访问

我怎样才能绕过它?

编辑:当前解决方法

var forbiddenOnStrictMode = ['caller', 'callee', 'arguments'];

var f2 = Object.getOwnPropertyNames(Function.prototype)
    .forEach(function(element) {
        if (forbiddenOnStrictMode.indexOf(element) == -1)
        console.log (typeof Function.prototype[element]);
});

可以说node-compiler暂时忽略严格模式吗?

【问题讨论】:

  • 这段代码的上下文是什么?首先是什么迫使它进入严格模式?它在类方法定义中吗?据我所知,您不能“取消定义”严格模式,但也许您可以将代码移到其他不处于严格模式的地方并调用它。
  • 我只是想为 JS-Function-methods 生成一个文档(如果Function.prototype[whatever] == 'function' 然后在文档中创建一个标题。但是例如Function.prototype.caller 在严格模式下无法访问(=default模式),因此您无法访问现有方法,因为编译器说 NO。
  • 我想问的问题是这段代码里面是什么,为什么它处于严格模式? node.js 代码默认情况下不处于严格模式,因此您正在做的事情是使其处于严格模式。我想知道为什么它处于严格模式。代码的什么上下文使它处于严格模式?您也许可以将此代码移出严格模式并调用它。
  • 您可以在浏览器的控制台中尝试以下操作:Object.getOwnPropertyNames(Function.prototype).forEach(function(element) {console.log (typeof Function.prototype[element]);}) Copy+paste+Enter
  • 你没有回答我的问题——我不明白为什么。浏览器控制台是一个非标准的地方,所以我不会尝试解决或解释控制台中的任何内容。如果你有真正的代码,你需要帮助解决一个真正的问题,然后显示真实代码的上下文。否则,我将继续处理一个真正的问题,以便在其他地方解决。

标签: javascript node.js function strict-mode


【解决方案1】:

我在节点 v8.8.1 中的测试表明,像你说的那样运行一个简单的文件不是在严格模式下。我认为你看到的是一个有点误导性的错误信息。不是您正在运行的代码处于严格模式。您正在尝试访问 Function.prototype 上的某些内容,该内容本身被标记为在严格模式下定义,因此解释器拒绝让您访问该对象上的这些属性。

可以说node-compiler暂时忽略严格模式吗?

不,没有办法做到这一点。但这实际上不是你的问题。你可以用这个来测试你自己的代码是否处于严格模式:

const isStrict = (function() { return !this; })();
console.log("strict mode", isStrict);

你会发现 node.js 运行的简单文件并不是严格模式。您的问题是您正在尝试访问由 node.js 标记为严格模式定义的原型。该严格模式定义内置于 JS 实现中。它不是来自代码中的严格模式。我不知道有什么方法可以改变它。我认为您将不得不解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多