javascript之this指向

this绑定规则

原则:谁调用了这个函数,那么this就会指向谁

默认绑定

默认绑定下,this会指向window对象(可以看作默认是由window对象调用了这个函数

var c = 3;

(function () {
   var c = 2;
   console.log(this.c) //3
})()

隐式绑定

如果是一个对象调用一个方法,那么this隐式绑定到这个对象上(对象调用了函数

var a = 2;
const obj = {
    a: "1",
    sayHi: function() {
        console.log(this.a); //1
    }
}
obj.sayHi();

硬绑定(call,bind,apply)

硬性绑定会直接改变默认的this指向,将this指向传入的对象,如以下代码

function fn1() {
    console.log(this);  //window
}
//默认this指向window对象
fn1();

//使用了call,将this硬性绑定到{x : 100}这个对象上, 并立即执行fn1()
fn1.call({ x: 100 });  //{x : 100}

//使用bind,同理将this硬性绑定到{y : 2000}这个对象上
const fn2 = fn1.bind({ y: 2000 });
fn2(); //{y : 2000}

构造函数绑定

this默认指向这个构造函数

function Lover(name) {
    this.name = name;
    this.sayName = function () {
        console.log(`lover is ${this.name}`);
    }
}

var name = "1";
var x = new Lover("2")
x.sayName();  //2

用class的写法同理

class People {
    constructor(name) {
        this.name = name
    }
    sayName() {
        console.log(this.name)
    }
}
var name = 1;
const x = new People("2")
x.sayName(); //2

再来巩固一下,看看以下三个都分别打印了什么?

var name = '人'
function special() {
    console.log(this.name)
}

var girl = {
    name: '女人',
    detal: function () {
        console.log(this.name)
    },
    woman: {
        name: '小花',
        detal: function () {
            console.log(this.name)
        }
    },
    special: special
}

girl.detal();
girl.woman.detal();
girl.special();

分析:

  1. girl.detal()显然是触发的隐式绑定的规则,所以this指向的是girl,打印“女人”
  2. girl.woman.detal()也触发了隐式绑定,但这次函数的调用者是woman对象,所以this指向的woman,打印“小花“
  3. gril.special()同理,还是隐式绑定,this指向的girl对象,打印"女人"

特殊情况

  1. 箭头函数中的this与上一级的this指向相同
var a = 2;
const obj = {
    a: "1",
    sayHi: () => {
        console.log(this.a); //2
    }
}
obj.sayHi();

由于箭头函数没有自己的的this,所以this会指向上一级,也就是window,所以会打印2

  1. 箭头函数不能通过call,bind强制绑定this的指向,这个道理和上面一样,箭头函数都没有自己的this,怎么改变绑定?就像下面代码一样
var name = 1;
const obj = {
    name: '2',
    sayName: () => {
        console.log(this.name);
    }
}

obj.sayName.call({name: 3}); //打印1
  1. setTimeout() 和 setInterval()

实际上这个也好理解,因为是window.setTimeout(fn, xxx), 所以在fn里面的this默认会指向window,比如如下代码

var name = 1;
const obj = {
    name: '2',
    sayName: function(){
        setTimeout( function(){
            console.log(this.name)
        }, 0)
    }
}
obj.sayName(); //打印1

再举个例子

var name = 1;
const obj = {
    name: '2',
    sayName: function(){
        setTimeout( ()=>{
            console.log(this.name)
        }, 0)
    }
}
obj.sayName(); //打印2

这里把setTimeout里面的改成箭头函数,则默认this会指向上一层的this指向,也就是obj,所以会打印2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:– JavaScript 中的患者数据管理系统 患者数据管理系统是为医院开发的 node JS 项目。通过使用此系统,您可以轻松访问患者数据,它具有成本效益,可改善患者护理和数据安全性。不仅如此,它还减少了错误范围。在运行项目之前,您需要下载 node.js。 这个患者数据管理项目包含 javascript、node.js 和 CSS。我们必须让服务器监听端口 3000,并使用 JSON 在客户端和服务器之间交换数据。这个项目会不断询问您有关插件更新的信息,因此请保持互联网畅通。此系统允许您执行 crud 操作。在这里,您是系统的管理员。您还可以添加所需的员工人数。此外,您还可以更新患者记录。该系统功能齐全且功能齐全。 要运行此项目,您需要在计算机上安装NodeJS并使用现代浏览器,例如 Google Chrome、  Mozilla Firefox。ReactJS项目中的此项目可免费下载源代码。有关项目演示,请查看下面的图像滑块。 对于手动安装 1.将主项目文件夹解压到任意目录 2.从 cmd 设置项目目录的路径 3. 输入命令“npm install” 4.完成后输入命令“npm start” 5.现在,您将获得一个 localhost:portnumber,并转到该 URL 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值