2

我试图了解“使用严格”的“this”规则;在以下情况下进行修改。

阅读(http://unschooled.org/2012/03/understanding-javascript-this/)后,我最好的猜测是,由于函数 isStrictModeOn() 没有“附加”到任何东西,这指的是空值。这被认为是仅将 this 附加到全局对象的 Javascript 更明智的替代方案。这是对在这种情况下“使用严格”所做的更改的正确解释吗?

http://www.novogeek.com/post/ECMAScript-5-Strict-mode-support-in-browsers-What-does-this-mean.aspx

function isStrictMode(){
    return !this;
} 
//returns false, since 'this' refers to global object and '!this' becomes false

function isStrictModeOn(){   
    "use strict";
    return !this;
} 
//returns true, since in strict mode, the keyword 'this' does not refer to global object, unlike traditional JS. So here,'this' is null and '!this' becomes true.
4

1 回答 1

2

这几乎是正确的。在严格模式下,当一个函数在没有接收者的情况下被调用时,this则为undefined(not null)。该功能的更好版本是:

function isStrict() {
  "use strict";
  return (typeof this) === 'undefined';
}

像这样的函数的一个固有问题是“严格性”是由词法确定的,就像范围一样,所以它是静态的。包含自己的测试器功能"use strict";不是很有用。它实际上只告诉您 JavaScript 运行时是否理解严格模式。没有自己的"use strict";会告诉您定义它的词汇上下文是否处于严格模式。那是:

function isStrict() {
  function test() {
    return (typeof this) === 'undefined';
  }
  return test();
}

调用时会告诉您 a 是否"use strict";在定义函数的范围内有效。我想这可能很有用。但是,如果对该函数的引用“泄漏”到“严格性”不同的其他上下文中,它将继续在其定义时报告其静态严格性。

"use strict";就个人而言,我会选择通过在最外层调用来确保我的代码绝对处于严格模式。这样就真的没必要去查了。

于 2013-06-17T15:17:09.563 回答