摘要
本文主要讲述了:
- 浏览器中的
this
- nodejs 中的
this
正文
浏览器中的this
全局上下文
在全局上下文中(即任何函数之外),无论是否是严格模式,this
永远指向全局对象
示例:
1 2
| console.log(this === window);
|
示例:
1 2 3 4
| 'use strict';
console.log(this === window);
|
函数上下文
在函数上下文中(即函数的内部),this
的指向取决于函数的调用方式。
直接调用时:
- 在非严格模式下,
this
指向全局对象
- 在严格模式下,
this
指向undefined
示例:
1 2 3 4 5
| function foo() { return this; }
console.log(foo() === window);
|
示例:
1 2 3 4 5 6 7
| 'use strict';
function foo() { return this; }
console.log(foo() === undefined);
|
作为对象的方法调用时:
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| var foo = { name: 'foo', sayHello: function () { console.log(this === foo); }, };
foo.sayHello(); var sayHello = foo.sayHello;
sayHello();
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 'use strict'; var foo = { name: 'foo', sayHello: function () { console.log(this === foo); }, };
foo.sayHello(); var sayHello = foo.sayHello;
sayHello();
|
示例:
1 2 3 4 5 6
| function foo() { return this; }
console.log(window.foo() === window);
|
示例:
1 2 3 4 5 6 7 8
| 'use strict';
function foo() { return this; }
console.log(window.foo() === window);
|
示例:
1 2 3 4 5 6 7 8 9
| function foo() { return this; }
console.log(foo.call(window) === window);
console.log(foo.apply(window) === window);
console.log(foo.bind({ age: 18 })() === window);
|
示例:
1 2 3 4 5 6 7 8 9 10 11
| 'use strict';
function foo() { return this; }
console.log(foo.call(window) === window);
console.log(foo.apply(window) === window);
console.log(foo.bind({ age: 18 })() === window);
|
类上下文
- 原型方法(包括构造函数)中的
this
指向实例本身
- 静态方法中的
this
指向类本身(类的构造函数)
继承
- 原型方法(包括构造函数)中的
this
指向实例本身;指向调用它的那个实例本身
- 静态方法中的
this
指向类本身(类的构造函数);指向调用它的那个类本身(类的构造函数)
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Animal { static isAnimal() { return this; }
sayHello() { return this; } }
class Human extends Animal {}
console.log(Human.isAnimal() === Human);
console.log(Animal.isAnimal() === Animal);
console.log(Human.prototype.sayHello() === Human.prototype);
console.log(Animal.prototype.sayHello() === Animal.prototype);
|
箭头函数
箭头函数中的this
指向:箭头函数被定义时所在的对象
示例:
使用前:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const foo = { name: 'foo', sayHello: function () { console.log(this);
setTimeout(function () { console.log(this); }, 1e3); }, };
foo.sayHello();
|
使用后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const foo = { name: 'foo', sayHello: function () { console.log(this);
setTimeout(() => { console.log(this); }, 1e3); }, };
foo.sayHello();
|
nodejs 中的this
注:nodejs 中的全局对象是global
模块上下文
模块中的this
指向module.exports
示例:
1 2
| console.log(this === module.exports);
|
示例:
1 2 3 4
| 'use strict';
console.log(this === module.exports);
|
因此,也可以通过this
来进行赋值,以达到输出的目的
示例:
learn_node/index.js
1 2 3 4
| const foo = require('./foo.js');
console.log(foo);
|
learn_node/foo.js
参考资料
本文对你有帮助?请支持我