- 普通函数调用: f();
- ecmascript3和非严格ecmascript5中this为全局对象, ecmascript5严格模式下this为undefined
- 普通函数调用通常不关心this, 不过可以用它判断是否处于严格模式
1 var strict = (function() { return !this; }());
- 方法调用: o.m();
- m中的this为调用对象o
- 方法返回this可构造链式调用
- this没有作用域限制, 嵌套函数不会从调用它的函数中继承this, 如果嵌套函数作为方法调用, 其this为调用它的对象. 如果作为普通函数调用, 遵守第一种调用方式
- 嵌套函数如果需要访问外部函数的this, 需要将this保存在外部函数变量中
1 var o = { 2 m: function() 3 { 4 var self = this; 5 console.log(this === o); // true 6 f(); 7 8 function f() 9 { 10 console.log(this === o); // false 11 console.log(self === o); // true 12 } // end f() 13 14 } // end m() 15 };
- 构造函数: new f()
- 没有形参的构造函数调用可以省略圆括号如: new Object;
- 构造函数调用创建一个新的空对象, 这个对象继承自构造函数的prototype属性. 构造函数初始化这个心创建的对象并将它作为this.
- new o.m(); 其中m的this不是o
- 构造函数通常不使用return, 如果构造函数使用return显式返回一个对象, 调用表达式结果就是这个对象. 如果return没有指定返回值或者返回一个原始值, 将忽略此返回值并使用初始化后的对象作为调用结果.
- 间接调用: apply() call() 通过参数设置this