閉じたオブジェクトの中のthis
1717 ワード
閉じたままでthisオブジェクトを使うと問題があります.私たちは、thisオブジェクトが動作時の関数に基づいて環境バインディングを実行していることを知っています.グローバル環境では、thisはwindowに等しいです.しかし、匿名関数の実行環境は大域的であるため、そのthisオブジェクトは一般にwindowを指す.しかし、クローズドの作成方法によっては、この点はそれほど明らかではないかもしれません.この例を見てもいいです.
各関数は呼び出し時に自動的に二つの特殊な変数を取得することを知っています.内部関数は、この2つの変数を検索すると、そのアクティブなオブジェクトだけが検索されますので、外部関数の2つの変数に直接アクセスすることはできません.ただし、外部作用領域のthisオブジェクトを一つのクローズドエネルギーの位置にある変数に保存すると、クローズドがそのオブジェクトにアクセスできるようになります.
思考:
//「My Object」
//「The Window」
var name = "This Window"
var object = {
name: 'My Object',
getNameFunc: function() {
return function() {
return this.name;
}
}
}
console.log(object.getNameFunc()()); // "The Window" ( )
上記のコードはまずグローバル変数nameを作成し、name属性を含むオブジェクトを作成しました.このオブジェクトは、匿名関数に戻り、匿名関数は、this.nameに戻る方法、get NameFun()も含む.getNameFun()は関数を返しますので、object.getNameFun()を呼出したらすぐに戻ります.結果として文字列を返します.しかし、この例が返された文字列の場合、グローバル変数のname値である「The Window」は、なぜ匿名関数が、作用領域(外部作用領域)を含むthisオブジェクトを取得していないのですか?各関数は呼び出し時に自動的に二つの特殊な変数を取得することを知っています.内部関数は、この2つの変数を検索すると、そのアクティブなオブジェクトだけが検索されますので、外部関数の2つの変数に直接アクセスすることはできません.ただし、外部作用領域のthisオブジェクトを一つのクローズドエネルギーの位置にある変数に保存すると、クローズドがそのオブジェクトにアクセスできるようになります.
var name = "This Window"
var object = {
name: 'My Object',
getNameFunc: function() {
var that = this;
return function() {
return that.name;
}
}
}
console.log(object.getNameFunc()()); // "The Window" ( )
注意: thisとargmentsも同じ問題があります.作用領域のアーグメンントオブジェクトにアクセスするには、そのオブジェクトの参照を別のクローズドパケットがアクセスできる変数に保存しなければなりません.思考:
var name = "This Window"
var object = {
name: 'My Object',
getNameFunc: function() {
return this.name;
}
}
object.getName();
(object.getName)();
(object.getName = object.getName)(); //
結果は:/「My Object」//「My Object」
//「The Window」