【问题标题】:Was Douglas Crockford wrong with Strict Mode Example?道格拉斯·克罗克福德 (Douglas Crockford) 的严格模式示例错了吗?
【发布时间】:2015-01-11 10:50:55
【问题描述】:

我确定他不是。我只是不明白他的演讲中的一个例子

http://youtu.be/UTEqr0IlFKY?t=44m

function in_strict_mode() {
    return (function () {
        return !this;
    }());
}

不是和这个一样吗?

function in_strict_mode() {
    return !this;
}

如果is_strict_mode() 我会method 那么我同意,因为this 然后会指向包含方法的对象,例如

my_object.in_strict_mode = function() {
    return (function () {
        return !this;
    }());
}

但是他为什么在他的例子中这样做(这是简单的函数,而不是对象的方法)?

【问题讨论】:

    标签: javascript strict


    【解决方案1】:

    this 的值取决于函数的调用方式。 ("anonymous" 在 Crockford 的代码中,但在你的代码中为 "only") 函数通过查看 this 的值来确定是否开启了严格模式,并要求在没有明确上下文的情况下调用该函数才能使其工作。

    如何调用 Crockford 的 in_strict_mode 函数并不重要,因为它使用不同的函数来实际获取它关心的数据。

    如何调用in_strict_mode 函数并不重要,因为它使用自身来获取数据。

    Crockford 版本旨在提供正确的结果,即使您将其用作对象的方法或使用 apply(something)call(something) 调用它。

    【讨论】:

      【解决方案2】:
      function in_strict_mode() {
          return !this;
      }
      

      这个函数可以返回不同的结果取决于你如何调用它。请记住,this 上下文是由函数 call 确定的,而不是由函数 definition 确定的。因此:

      in_strict_mode.call(new Object()) === false
      

      Crockford 的版本定义并立即调用内部函数,因此它可以控制调用内部函数内部的this 上下文。因此,他的 in_strict_mode 不能被 .call 用不同的 this 上下文欺骗来返回其他内容。

      【讨论】:

        【解决方案3】:

        显示的函数可以双向工作...即,您可以将其放在“命名空间”中,并且仍然会告诉您是否处于严格模式。

        如果将简化版本 return !this 放在命名空间中并使用 mylib.in_strict_mode() 调用,则不会返回正确的结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-30
          • 2012-03-17
          • 2015-01-31
          • 1970-01-01
          • 2012-10-07
          相关资源
          最近更新 更多