我经常看到并使用self
作为数据成员来保证对所有嵌套作用域内的根对象的正确访问:
function Foo() {
var self = this; // Common design pattern
}
但是,我不明白为什么在以下代码段中定义了self
(请参阅this jsfiddle):
function Foo() {
}
Foo.prototype.foo = function() {
// Returns 'object'! Why is 'self' defined?
console.log("typeof self = " + typeof self);
}
var f = new Foo();
f.foo(); // Prints "typeof self = object"
有人可以解释为什么self
在函数的prototype
对象上定义的函数内可用。
答案 0 :(得分:3)
self
是全局window
对象的属性,因此无需使用window
作为前缀即可使用它。由于window
是一个对象,这就是控制台吐出的内容,但console.log
行可以是self
未被重新定义为其他内容并且会提供相同输出的任何位置。
当您看到开发人员声明一个名为self
的变量时,他们正在为该标识符创建一个更本地的定义,并且在该范围的持续时间内隐藏全局自我。
示例:
// In the global scope:
console.log(self); // window
function foo(){
// this declaration will hide the global self with a local version
// only good for this function
var self = this; // or whatever
console.log(self); // Depends on how foo is invoked
}
如果您修改示例代码,请稍微修改:
function Foo() {
}
Foo.prototype.foo = function() {
// Returns 'object'! Why is 'self' defined?
console.log(self); // <-- not typeof self
}
var f = new Foo();
f.foo(); // Prints window
顺便说一句,这就是为什么开发人员不会使用self
这个词,而是使用that
:
var that = this;