道格拉斯·克罗克福德在严格模式示例中错了吗?

7
我确定他不是故意的。只是我不理解他演示中的一个例子。 http://youtu.be/UTEqr0IlFKY?t=44m
function in_strict_mode() {
    return (function () {
        return !this;
    }());
}

这不是和这个一样吗?
function in_strict_mode() {
    return !this;
}

如果is_strict_mode()是一个方法,那么我同意,因为this指向包含该方法的对象,例如:
my_object.in_strict_mode = function() {
    return (function () {
        return !this;
    }());
}

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

7
this的值取决于函数的调用方式。在Crockford的代码中,("anonymous"但在你的代码中是"only")函数通过查看this的值确定是否开启了严格模式,并要求函数在没有显式上下文的情况下调用才能正常工作。
无论您如何调用Crockford的in_strict_mode函数,都不会影响它使用不同的函数获取其关注的数据。
但是,您调用in_strict_mode函数的方式很重要,因为它使用自身来获取数据。
Crockford版本的设计旨在即使将其用作对象的方法或使用apply(something)call(something)进行调用时,也能提供正确的结果。

2
function in_strict_mode() {
    return !this;
}

这个函数的返回结果可能会根据调用方式而有所不同。请记住,this 上下文是由函数的 调用 决定的,而不是函数的 定义。因此:

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

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


2

这个函数可以双向工作...即使你把它放在“命名空间”中,它仍然会告诉你是否处于严格模式。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接