2012-01-15 21 views
0

我々は次のコードをノードJS単純な関数と `this`

function test(){ 
    console.log("function is " + this.test); 
} 
test(); 

test実行されるChromeウィンドウにwindowオブジェクトに機能として追加し、それが

function is function test(){ 
    console.log("function is " + this.test); 
} 
を示していることを知りますコンソールの

私は、ファイルsample.jsで同じコードを入れて、それが

function is undefined 

を与えるしかし、ときに私はnodeターミナル

に直接同じコードを実行される node

nodejs$ node sample.js 

を使用して実行します

nodejs$ node 
> function test(){ 
...   console.log("function is " + this.test); 
...  }test(); 

ブラウザと同じ出力を示します。

これがなぜ起こり、V8エンジンがJavascriptファイルを実行するのか、誰でも説明できますか?もっと知りたいのですが、可能であれば、これに関する記事やチュートリアルへのリンクを提供してください。

+0

プットは、アンダースコア 'is_function_test' – clyfe

答えて

1

ノード内のグローバルオブジェクトの動作は異なります。モジュールには独自のスコープがあります。 "global.foo = true"を使用してのみ真のグローバルを作成することができます

0

良い質問! sample.js

function is function test(){ 
    console.log("this is " + this); 
} 
test(); 

で次のコードを使用して

クロムDOMWindowの範囲で実行されている時に、テスト()ことを示している:

this is [object DOMWindow] 

ノードが一度にテストすることを示しています()はオブジェクトglobalのスコープ内で実行されています:

this is [object global] 

しかし、以降はモジュールsample.jsの一部として定義されており、test()の実行時にはthis.testは未定義です。

+0

http://nodejs.org/api/globals.html#globals_global理由は、あなたが – Tamil

+0

を言及しているものそれがない場合、テスト() 'this'はグローバル名前空間オブジェクトを参照します。 test()がモジュールの内部で定義されているとき、それはグローバル名前空間の一部ではないので、global.testは未定義です。 有用な説明なしに投票した人は、みんなの時間を無駄にしています。 – mike

+0

あなたのコメントはあなたの答えよりもはっきりしています。 'test()はモジュールsample.js'の一部として定義されていますが、' test.test()が実行されているときにthis.testは定義されていません.'本当はありません。 – Tamil

0

基本的@iglが述べたように、モジュールが持っている彼らのown scope

あなたは、そのノードがそれを実行する前に

(function() { 
// Your module code goes here 
})() 

の周りのすべてのあなたのmoduleコードをラップと仮定することができます。したがって、モジュール自体のローカルスコープを作成します。

理由:それは汚染さ

シナリオを得ることから、グローバルスコープを防ぐことができます は:は、あなたがそれにテスト機能を有しており、また、別のモジュールがSAMPLE2を言うmoduleサンプルがあるとしていますまたテストの機能があります。ノードがサンプルとサンプル2のローカルスコープを作成していない場合は、テスト関数のいずれかがもう一方の関数をオーバーライドします。ここで

var sample = 'you will not see me in global object'; 
hai = 'but i will be there'; 
test = function() { 
    console.log("function is ", this.test); 
} 
console.log(global); 
test(); 

のないvarインフロントはハイテストはありませんそれゆえに:

はまた、あなたはノードが唯一のモジュールのmodule.exports対象に

例興味があることを理解する必要がありますブラウザウィンドウのスコープ内で同じでglobalになります。今

hai: 'but i will be there', 
test: [Function] } 
function is function() { 
    console.log("function is ", this.test); 
} 

あなたは大きなglobalオブジェクトのプロパティのリストと、またあなたのテスト関数の定義を参照する必要があり、ローカル・ノードのインスタンスで上記を実行してみてください。 サンプルがリストに存在しませんが、