1. 函数名直接调用
例如getName();这样的调用无论实在那个地方,无论函数定义在全局或者某个函数体内部,函数的this指向window
function a () {
console.log(this)// window
b();
function b () {
console.log(this)// window
}
}
a()
2. 对象的方法调用 obj.getName
对象的方法调用this指向对象本身,如下
let name ='zhangsan'
let obj = {
name:'lisi',
getName(){
console.log(this.name)// lisi
}
}
obj.getName();
3. 构造函数内部
function Teacher () {
this.name ='prototype';
}
Teacher.prototype.getName =function () {
console.log(this.name) // liming
}
let t =new Teacher();
t.name ='liming';
t.getName()
去掉t.name = 'liming',结果为prototype
通过new函数this指向new出的当前对象,如果直接调用和普通函数一样,指向window;
同样的,构造函数的原型对象指向当前对象
4. call,apply和bind改变this指向
let obj = {
name:'lisi',
getNmae() {
return this.name;
}
}
let obj2 = {name:'zhangsan'};
console.log(obj.getNmae.call(obj2)) // zhangsan
5. 箭头函数
箭头函数的this指向父级作用域.
var name ='张三' // 如果let,那么打印的就是空,因为let声明的变量不会挂载到window上去
let obj = {
name:'李四',
getNmae() {
printName()
}
}
let printName = () => {
console.log(this.name)
}
printName();
obj.getNmae();
6. export中的this
a文件:
function test () {
console.log(this)
}
export {test}
b文件中import,然后调用
import {test}from './test.js'
test(); // 打印的是undefined
原因:
1. 代码是在模块作用域之中运行,而不是在全局作用域中运行。模块内部的顶层变量是外部不可见的。
2. 在模块之中,顶层的this关键字返回undefined,而不是指向window。也就是说,在模块顶层使用this关键字是无意义的
网友评论