ここには実際にはスコープがないためです。すべてのthis
アクセスはwindow
オブジェクトを参照します。したがって、this.myRefVar
内側のスコープで編集しているときは、実際には で値を編集していますwindow
。
var theName = "SO";
var myObject = function(){
this.theName = "SO2";
this.foo = function() {
this.theName = "SO3";
}
}
ここでは、いくつかの変数と関数を定義しました。variabletheName
は、最初にスコープで宣言されroot(window)
、次にスコープ内で宣言されmyObject
ます (このようなスコープはありません。説明のためだけに、次にfoo
スコープ内です。)
console.log(theName); // SO
console.log(this.theName); // SO
console.log(window.theName); // SO
console.log(myObject.theName); // undefined
console.log(myObject.foo); // undefined
console.log(this.foo); // undefined
console.log(window.foo); // undefined
ここでは、theName
さまざまな方法で変数にアクセスしようとしています。ここで実際にスコーピングがある場合、関数呼び出しの後に 4 番目のスコーピングが機能するはずです。他のものは同じアイデアを表しているだけですが、方法は異なります。
myObject();
console.log(theName); // SO2
console.log(this.theName); // SO2
console.log(window.theName); // SO2
console.log(myObject.theName); // undefined
console.log(myObject.foo); // undefined
console.log(this.foo); // function myObject/this.foo()
console.log(window.foo); // function myObject/this.foo()
関数呼び出し後、思い通りにアクセスできませんmyObject.theName
。これは、関数のプロパティにアクセスしようとしているのではなく、この方法で呼び出してmyObject.theName
も実際にはmyObject
スコープにアクセスしていないためです。そして、実際にこの関数をオブジェクトとして定義/インスタンス化/作成しないと、プロパティにアクセスできません。theName
myObject
myObject.theName;// undefined. Accessing myObject as a function
new myObject().theName // SO2. Accessing an object derived from myObject.
あなたのコードで起こっていることは、実際にはスコーピングではなくクロージャーです。理解を深めるために:
Scopping Closures
Similar
SO question