我确定他不是。我只是不理解他演讲中的一个例子
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;
}());
}
但是为什么他在他的例子中做到了(这是一个简单的函数,而不是一个对象的方法)?
答案 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
上下文来欺骗其他内容。