2017-02-01 8 views
2

JavaScriptでは、オブジェクト内に定義されている無名関数の場合、thisキーワードはオブジェクト自体を参照します。関数は、オブジェクトの範囲外で定義されている場合しかし、thisは、ウィンドウオブジェクト、例えば指す:Javascriptメソッドからの呼び出しオブジェクトへのアクセス

function foo() { 
 
    console.log(this) 
 
} 
 

 
let A = { 
 
    att: foo(), 
 
    att2: "bla" 
 
} 
 

 
A.foo();

[EDIT]:私は元のコードでミスを犯し、私がすることを意味A.attとしての機能を呼び出す()(と私はATTを維持する義務がいます:FOO()私のコードは基本的に以下の通りである。

function foo() { 
 
    console.log(this) 
 
} 
 

 
let A = { 
 
    att: foo(), 
 
    att2: "bla" 
 
} 
 

 
A.att();

ここでの出力は、アクセスしたいオブジェクトではなく、オブジェクトウィンドウです.Aは変更できません。どうすればfoo()からAにアクセスできますか?

+0

'A.att'が' undefined'あります。 – str

+0

あなたのためにスニペットを作成しました。 attに代入されると、foo()を実行することがわかります。 A.foo()は存在しません、A.attは – mplungjan

答えて

1

機能のthisキーワードは少し異なる振る舞い他の言語と比較してJavaScriptで。また、厳密モードと非厳密モードの間にいくつかの違いがあります。ほとんどの場合、thisの値は、関数の呼び出し方法によって決まります。実行中に代入によって設定することはできず、関数が呼び出されるたびに異なることがあります。

あなたはapply & bind、JSメソッドcallを使用することができます自分でthisオブジェクトを操作すること。

Function.prototype.call()

詳細情報:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

function foo() { 
    console.log(this) 
} 

var A = { 
    att: foo, 
    att2: "bla" 
} 

foo.call(A); 

Function.prototype.applyの()

は、例えば各を実証することができます

詳細情報: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

function foo() { 
    console.log(this) 
} 

var A = { 
    att: foo, 
    att2: "bla" 
} 

foo.apply(A); 

Function.prototype.bind()

詳細情報:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

function foo() { 
    console.log(this) 
} 

var A = { 
    att: foo, 
    att2: "bla" 
} 

var x = foo.bind(A); 
x(); 
-1

ここでの質問は、私が関数を呼び出す場所(実際にはオブジェクトA)からこの(オブジェクト)を取得する方法であるため、私は答えに同意しないと言います。 Object関数を代わりにグローバル関数に直接バインドする関数です。この例では、元の関数に影響を与えることなく、任意の数のオブジェクトでこれを行うことができます。 JavaScriptで

function foo() { 
 
    console.log(this) 
 
} 
 

 
let A = { 
 
    att: foo, 
 
    att2: "From A" 
 
} 
 

 

 
let B = { 
 
    att: foo, 
 
    att2: "From B" 
 
} 
 

 
B.att = B.att.bind(A) 
 

 
A.att(); 
 
B.att()

0

、オブジェクト内に定義匿名関数のために、thisキーワードは、オブジェクト自体を指します。ただし、オブジェクトスコープ外で関数が定義されている場合は、

いいえ。関数が定義されている箇所は無関係です。 thisの値を決定する関数の呼び出し方法です。

ここでの出力は、あなたがfoo()を呼び出した後、attに戻り値を代入しているためであるA.

あるオブジェクトウィンドウではなく、私がアクセスしたいオブジェクトです。 thiswindowです。コンテキストを指定してfoo()を呼び出していないためです。

A.foo()undefinedなので、後でエラーとなるA.foo();を呼び出します。

変更:att: foo()att: fooにそうあなたが代わりにそれを呼び出す機能を割り当て、変更A.foo()A.att()

function foo() { 
 
    console.log(this) 
 
} 
 

 
let A = { 
 
    att: foo, 
 
    att2: "bla" 
 
} 
 

 
A.att();

+0

ありがとう!私はすでにA.att()を呼び出すことを意味していましたが、それは私のタイプミスでした。これは動作しますが、私はAを変更することはできません。そのattはatt:foo()ではなくatt:foo()として定義されています。私の場合、呼び出し元はウィンドウオブジェクトになります。 –

+0

@ RawanMoukalled - 'A'を変更できない場合は、問題を解決できません。 'this'の値は関数がどのように呼び出されたかに依存し、現在は' A'を定義するコードの一部です。 – Quentin

-1
function foo() { 
    console.log(this) 
} 

let A = { 
    att: foo(), 
    att2: "bla" 
} 

foo.call(A); //It will return Object A 
+2

このコードは質問に答えるかもしれませんが、このコードが質問に答える理由と理由についての追加の文脈を提供することで、長期的な価値が向上します。 –

関連する問題