ここには実際にはスコープがないためです。すべての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スコープにアクセスしていないためです。そして、実際にこの関数をオブジェクトとして定義/インスタンス化/作成しないと、プロパティにアクセスできません。theNamemyObject
myObject.theName;// undefined. Accessing myObject as a function
new myObject().theName // SO2. Accessing an object derived from myObject.
あなたのコードで起こっていることは、実際にはスコーピングではなくクロージャーです。理解を深めるために:
Scopping Closures
Similar
SO question