私は少しの周りにプレーしてきたので、Javascriptがボンネットの下にどのように動作するかを理解しようとしています。例えば、次のコードは、Node.jsの中にChromeのコンソール又は異なる出力を生成します。
var length = 10;
function fn () {
console.log (this.length);
}
fn();
Chromeで、私はノードで、これが定義されていない間、値10は、ログインして取得します。ノードには、グローバルオブジェクトが異なる動作を有しているウィンドウオブジェクトでは、グローバル変数は、ウィンドウのプロパティとして扱われるので、これは?もしそうなら、どのようなグローバルオブジェクトで起こっている、そしてどのように私はglobal.lengthを宣言せずに、ウィンドウと同様の挙動を得ることができますか?私が理解するよりも、他の目的ではありません、ただの練習としてこれをやっています。
違いの理由は、ブラウザでトップレベルのスコープということであるスクリプトがグローバルスコープですが、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
(なぜ私が変わったlength
のfoo
?デフォルトでは、ので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>