JS'厳格モード'


译文1リンク:小さな鬼の简単な本
なぜこのような文章を書くことを考えたのか、出所はSGの上の質問に答えることにある.では問題はこうです.
var a = 2; 
function foo(){ console.log(this.a);}
foo();

以上のコード、実行した結果は何ですか??
もしあなたが2と答えたら、どのくらい正しいですか?
半分は正しいとしか言えませんが、どうしてですか.実际には、问题の主な问题は、彼は环境を规定していないので、答えが多く、直接ブラウザの中で次のように书き方を実行します.
 
    var a = 2; 
    function foo(){ console.log(this.a);}
    foo();
 

確かに2が出力されますが、問題ありません.
しかしnodejsでは、皆さんは考えたことがありますか?
結果は2かもしれないしundefinedかもしれない.今、誰かが輪をかぶっているのではないでしょうか.なぜか分かりません.では解析の文章は
http://f2e.souche.com/blog/a-js-problem-about-global/
その後もsgの原問題を見ることができます
http://segmentfault.com/q/1010000004053433?_ea=473968
コメントで一つの問題について議論しましたが、ブラウザで「厳格モード」を使うとどうなりますか?
 
    "use strict"
    var a = 2; 
    function foo(){ console.log(this.a);}
    foo();
 

結果は間違いを報告します.間違いは以下の通りです.みんなの予想を裏切ったのではないでしょうか.
  Uncaught TypeError: Cannot read property 'a' of undefined(…)

ではなぜでしょうか.このキーワードを印刷してみるとundefinedです.私は操って、これは私达の考えと合わないで、どうしてwindowというグローバル変数ではありませんか??このすべての原因は「use strict」にある.
では、厳密なパターンとは何か、mozileの公式ドキュメントはここで説明します.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Securing_JavaScript
主な注意点は「Changes in strict mode」という欄の下で、「Securing JavaScript」の第1条
First, the value passed as this to a function in strict mode is not forced into being an object (a.k.a. "boxed"). For a normal function, this is always an object: either the provided object if called with an object-valued this; the value, boxed, if called with a Boolean, string, or number this; or the global object if called with an undefined or null this. (Use call, [apply](https://developer.mozilla.org/en-US/Web/JavaScript/Reference/Global_Objects/Function/apply), or [bind](https://developer.mozilla.org/en-US/Web/JavaScript/Reference/Global_Objects/Function/bind) to specify a particularthis.) Not only is automatic boxing a performance cost, but exposing the global object in browsers is a security hazard, because the global object provides access to functionality that "secure"JavaScript environments must restrict. Thus for a strict mode function, the specified this is not boxed into an object, and if unspecified, this will be undefined:
  "use strict";function fun() { return this; }
  console.assert(fun() === undefined);
  console.assert(fun.call(2) === 2);
  console.assert(fun.apply(null) === null);
  console.assert(fun.call(undefined) === undefined);
  console.assert(fun.bind(true)() === true);

デフォルトでfunctionにthisオブジェクトを指定しないという意味です.一般的に、私たちのfunctionには必ず呼び出しオブジェクトがあります.文字でも配列でもグローバル変数でも、この変換はパフォーマンスを損ない、危険です.グローバルオブジェクトが露出しているので、厳格なモードでは、thisオブジェクトはカプセル化されません.もしなければ、undefinedです.
以上が私たちが実行し、報告を間違えた原因です.このパターンはいったいいいのだろうか.実はいくつか論争があって、多くの人はjsを書いてすでにこれらの各種の変化に慣れて、あるいは便利なためでしょう、しかし多くの書き始めたばかりの人はとても慣れていないで、甚だしきに至っては分からないで、仁者は仁智者を見て知恵を見ましょう.
簡単な探求では、この厳格なパターンが早く出てきて、多くの人が書いたことがあります.そして、公式ドキュメントは詳しいです.もちろんもっと重要なのは、使わなくても何の問題もありません.一度使ったら注意してくださいね.