2017-11-16 4 views
1

thisキーワードスコープグローバル/プライベートを理解するために以下の機能を試しました。'this'クロージャー機能内のJavaScriptの混乱

私はそれを97%理解しました。しかし、その中にプライベート関数ではなく、民間の値を返しますx.private_fa()の出力上の混乱に捕まってしまいました。コードで

a = 1.1; 
 
b = 2.1; 
 
c = 3.1; 
 

 
function fa() { 
 
    return "Global fa()"; 
 
} 
 

 
function f() { 
 
    var a = 1; 
 
    this.b = 2; 
 

 
    function fa() { 
 
    return this.b; // or this.a not working..! 
 
    //return b // 2.2 
 
    //return a // 1 
 
    } 
 

 
    return { 
 
    private_a: a, // 1 
 
    global_a: window.a, // 1.1 
 
    private_b: this.b, // 2 
 
    global_b: b, // 2.1 
 
    private_fax: fa(), // 2.1 
 
    private_fa: fa, // function private fa() 
 
    global_fa: window.fa(), // Global fa() 
 
    global_c: c, // 3.1 
 
    private_c: this.c // 3 
 
    }; 
 
} 
 

 
try { 
 

 
    f.prototype.c = 3; 
 

 
    var x = new f(); 
 

 
    f.prototype.c = 4; 
 

 
    console.log("x:", x); 
 

 
    /*??? Please explain this.. ??? */ 
 
    console.log("x.private_fa():", x.private_fa()); 
 

 
    console.log(x.private_c); 
 
    var x1 = new f(); 
 
    console.log(x1.private_c); 
 

 
    console.log(" - End - "); 
 
} catch (e) { 
 
    console.error("Error: ", e.message); 
 
}

+0

は、 'VAR b_internal = this.b'のように、機能に入る前に別の変数に代入して、クロージャ内では'持っb_internal'を持っています正しい値。 –

+0

さらに良いことに、あなたはすべてのメンバーにアクセスする(そしておそらくそれらを修正)する必要がある場合、 'VARトン= this'のように' this'と同じ操作を行い、その後、クロージャ内で 'TBを返す;' –

+0

このされ、この 'ので、 'は、関数が定義されている場所ではなく、関数が呼び出されるコンテキストを参照し、' f'で返すオブジェクトに 'a'または' b'プロパティがないことに気づくことができます。と呼ばれる。 Federicoのように関数に値を格納する(closure)か、関数が定義されている場所に対応する "安定した" 'this 'を持つES6の矢印関数を使用する方法もあります – Kaddath

答えて

1

は、オブジェクトのxはbメンバー(およびFA戻りthis.b)を持っていないという理由だけで、x.private_fa()戻りundefinedへの呼び出しを掲載。 、thisは永遠に希望f()コンテキスト(に縛られるbound_fa機能で

var bound_fa = fa.bind(this); 

return { 
    private_a: a, // 1 
    global_a: window.a, // 1.1 
    private_b: this.b, // 2 
    global_b: window.b, // 2.1 
    private_fax: fa(), // 2.1 
    private_fa: bound_fa, // function private fa() 
    global_fa: window.fa(), // Global fa() 
    global_c: window.c, // 3.1 
    private_c: this.c // 3 
}; 

:あなたはそれは価値があなたのオブジェクトのprivate_faリターンfa()「プライベート」のバウンドバージョンを聞かせて戻したい場合は

変数bが所属しています)。

この読みはさらにこの謎を解明できます。https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch1.md

+0

ありがとうございます。この回答は専門的で標準的です。 –