2016-07-26 14 views
2

いくつかの愚かな質問が、オブジェクトに:JavaScript関数へのアクセスは..プロパティ

それはグローバル変数を探しているので、あなたが何かに名前をスコープしていないので、
var a = { 
    name:"321", 
    foo: function(){ 
     console.log(name); 
    } 
} 

a.foo(); 
+3

'はconsole.log(this.name);' –

+0

は、ブラウザのコンソールをチェックしてください。それは何も印刷しません。 'name'を' this.name'に変更し、 '321'が表示されるはずです! – Noah

+0

@ノア、実際には何かを印刷します。空の文字列! [window.name](https://developer.mozilla.org/en-US/docs/Web/API/Window/name) –

答えて

7

。 あなたはこのようthisキーワードを使用することができます

console.log(this.name); 
+0

私は 'this.name'が動作することを理解しています。なぜ関数が 'name'プロパティにアクセスできないのか不思議です。 – user2598794

+1

@ user2598794 'this'がなければ、コードは' name'という名前のスコープ付き変数を検索し、同じオブジェクトの別のプロパティはスコープ内では考慮されません。あなたがグローバルなvar 'name'を持っていれば、その値を見るでしょう。 – DrakaSAN

+0

@DrakaSANオブジェクト内の「名前」がスコープの内側にあるとは考えられないのはなぜですか?どこで検索を開始するのですか? – user2598794

1

console.log(name); 

を交換してみてください - あなたのコードのconsole.log(this.name); .IN結果window.name変数がすでに存在しているので、あなたは空の文字列ではなく、未定義のエラーを参照してくださいあなたのオブジェクトの名前変数とは関係ありません。

1

リッチリネルのコメントに次のように答えます:

fooはオブジェクトの関数スコープの例で、コールバックのスコープの場合はbarです。

コード:

var foo = "global", 
    bar = "global", 
    a = { 
    foo: (callback) => { 
     // var foo = 'local'; 
     console.log('foo: ' + foo); 
     callback(); 
    } 
}; 

(() => { 
    // var bar = "parent"; 
    a.foo(() => { 
     // var bar = "local"; 
     console.log('bar: ' + bar); 
    }); 
})(); 
+0

私は '1'という名前だけをコメントアウトし、 "name:3"という名前を印刷します。私が '1'と '3'とコメントした場合、空文字列が表示されます。関数スコープがまったく見えないように見えます。 – user2598794

+0

@ user2598794:ああ、はい、私はその場合、コールバックとは異なり、グローバルスコープにスキップすることを忘れていました。私は私の例を編集しました。 – DrakaSAN

関連する問題