Douglas Crockford对Strict Mode示例有错吗?

时间:2015-01-11 10:50:56

标签: javascript strict

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

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;
    }());
}

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

3 个答案:

答案 0 :(得分:7)

this的值取决于函数的调用方式。 Crockford代码中的“(匿名”,但在你的“仅”中)函数通过查看this的值来确定是否启用了严格模式,并且要求在没有明确上下文的情况下调用该函数。

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

调用in_strict_mode函数的方式很重要,因为它使用自身来获取数据。

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

答案 1 :(得分:2)

显示的功能可以双向工作...即你可以把它放在"命名空间"并且仍然会告诉你你是否处于严格模式。

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

答案 2 :(得分:2)

function in_strict_mode() {
    return !this;
}

此功能可以返回不同的结果,具体取决于您的调用方式。请记住,this上下文由函数调用决定,而不是函数定义。因此:

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

Crockford的版本定义并立即调用内部函数,因此它可以控制内部函数调用中的this上下文。因此,他的in_strict_mode无法通过.call使用不同的this上下文来欺骗其他内容。