ウィンドウ(ブラウザ)およびグローバル(Node.jsの)オブジェクトとの間の差

Cipriana:

私は少しの周りにプレーしてきたので、Javascriptがボンネットの下にどのように動作するかを理解しようとしています。例えば、次のコードは、Node.jsの中にChromeのコンソール又は異なる出力を生成します。

var length = 10;
function fn () {
  console.log (this.length);
}
fn();

Chromeで、私はノードで、これが定義されていない間、値10は、ログインして取得します。ノードには、グローバルオブジェクトが異なる動作を有しているウィンドウオブジェクトでは、グローバル変数は、ウィンドウのプロパティとして扱われるので、これは?もしそうなら、どのようなグローバルオブジェクトで起こっている、そしてどのように私はglobal.lengthを宣言せずに、ウィンドウと同様の挙動を得ることができますか?私が理解するよりも、他の目的ではありません、ただの練習としてこれをやっています。

TJクラウダー:

違いの理由は、ブラウザでトップレベルのスコープということであるスクリプトがグローバルスコープですが、Node.jsのファイルのトップレベルのスコープはモジュールスコープです。(デフォルトでは緩やかなモードになっている古いスタイルのNode.jsモジュールだが、Node.jsのの最近のバージョンでは、strictモードであるJavaScriptの標準モジュールスコープ、に選ぶことができます。)

グローバルスコープでは、varあなたが経由でアクセスできるグローバルオブジェクト、上のプロパティを作成windowを通じて、グローバルthisグローバルスコープで、または経由してthisあなたがセットに何の特定を行うことなしに呼び出すルーズモード機能ではthisあなたのコールfn設定なしで呼ばれたルーズモード機能:上記はその最後のカテゴリですthis

しかし、Node.jsのモジュールのスコープで、var単に作成varモジュールでは、それがグローバルまたはグローバルオブジェクトのプロパティを作成しません。それは、これを行うようなものです:

(function() { // The wrapper Node.js provides node-style modules
    // This is "module" scope
    var foo = 10;
    function fn () {
      console.log (this.foo);
    }
    fn();
})();         // End of the wrapper

(なぜ私が変わったlengthfoo?デフォルトでは、のでwindow持っているlength財産問題を混同し、[ウィンドウに含まれるフレームの数を]。:-))

だから、スコープ内だけの違いです。


また経て、クロムなどの近代的なブラウザ、上のモジュールスコープを使用することができますtype="module"上のscriptタグ。JavaScriptの標準モジュールは、strictモードでは常にあるので、しかし、thisコール内部はするfnだろうundefinedエラーの原因:

<script type="module">
var length = 10;
function fn () {
  console.log(this);        // undefined
  console.log(this.length); // TypeError
}
fn();
</script>

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=13386&siteId=1