欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS中this的使用

程序员文章站 2022-05-25 18:28:39
this 前排提示:this只有在执行的时候才能确认,定义时无法被确认。 1. 作为对象属性执行 2. 作为构造函数执行 3. 作为普通函数执行 4. call,apply,bind可以改变this的指向 这里引用下 "追梦子博客" 的一些知识 上面代码说明了,只要构造函数不返回对象,就不会影响新建 ......

this

前排提示:this只有在执行的时候才能确认,定义时无法被确认。

1. 作为对象属性执行

var name = '李四';
var person = {
  name: '张三',
  getname() {
    console.log(this.name); // 这个this是啥,不知道,我又没调用这个方法
  }
};

person.getname(); // 此时this为person, 作为对象属性执行,输出张三

2. 作为构造函数执行

function foo(name) {
  this.name = name; // 此时的this === {}
};
var f = new foo('张三');

3. 作为普通函数执行

var name = '李四';
var person = {
  name: '张三',
  getname() {
    console.log(this.name)
  }
};
var per = person.getname;
per();
// 此时输出李四而不是张三, this已经为window了,在全局作用域中定义了name变量,自然输出全局的name
// 而不是person对象的name

4. call,apply,bind可以改变this的指向

var p1 = {
  name: '张三',
  getname(age, job) {
    console.log(this.name, age, job);
  }
};
var p2 = {
  name: '李四'
};
p1.getname.call(p2, 18, '前端工程师'); // 输出李四18前端工程师
p1.getname.apply(p2, [18, '前端工程师']); // 输出李四18前端工程师
p2.getname = p1.getname.bind(p2);
p2.getname(18, '前端工程师'); // 输出李四

这里引用下的一些知识

function fn() {
  this.name = 'fn';
  return {};
}
var f = new fn();
console.log(f.name); // 输出undefined
function fn() {
  this.name = 'fn';
  return function () {};
}
var f = new fn();
console.log(f.name); // 输出undefined
function fn() {
  this.name = 'fn';
  return undefined;
}
var f = new fn();
console.log(f.name); // 输出fn
function fn() {
  this.name = 'fn';
  return 1;
}
var f = new fn();
console.log(f.name); // 输出fn

上面代码说明了,只要构造函数不返回对象,就不会影响新建的实例。