this的指向问题

全局作用域下的this指向

无论是否是严格模式,全局作用域下的this始终指向window

函数内部的this

严格模式下:

function test() {
'use strict'
console.log(this)
}
test(); // undefined
window.test(); // window

非严格模式下:

function test() {
console.log(this)
}
test(); // window
window.test(); // window

严格模式下,对函数的调用必须严格地写出被调用函数的对象,不可以省略。非严格模式,可以省略。

对象内部方法的this

对象内部方法的this指向调用这些方法的对象,也就是谁调用就指向谁

let obj = {
test: function() {
console.log(this);
}
}
obj.test(); // obj

箭头函数中的this

箭头函数没有this,它会绑定最近的非箭头函数作用域中的this。从父级作用域一直往上找,直到找到this的指向为止。

let obj = {
test: () => {
console.log(this);
}
}
obj.test(); // window

如果test是普通函数,那么它的this应该绑定的是obj。

然而test现在是箭头函数,因此它的this要找到obj的父级作用域,也就是window,因此this指向window。

构造函数中的this

构造函数中的this是指向实例的。

function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
} let p = new Person("cxk", 20, 'girl');
console.log(p.name); // cxk
console.log(p.age); // 20
console.log(p.sex); // girl

bind/call/apply 改变this指向

三个方法的区别:

他们都是用来改变相关函数的this指向的。

但是call/apply是直接进行相关函数的调用;bind不是执行相关函数,而是返回一个新的函数,这个新的函数已经自动绑定了新的this指向。

var user = {
test: function() {
console.log(`My name is ${this.name}, ${this.age} years old.`);
},
test2: function(from, to) {
console.log(`My name is ${this.name}, ${this.age} years old. I'm from ${from}, Iwana go to ${to}`);
}
} var db = {
name: 'CXK',
age: 18
} user.test.call(db);
user.test.apply(db);
user.test.bind(db)();
// My name is CXK, 18 years old. user.test2.call(db, 'beijing', 'shanghai');
user.test2.apply(db, ['beijing', 'shanghai']);
user.test2.bind(db, 'beijing', 'shanghai')();
// My name is CXK, 18 years old. I'm from beijing, I wanna go to shanghai.

this的指向问题、bind/call/apply改变this指向的更多相关文章

  1. call()与apply() 改变this指向

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #a5b2b9 } span.Apple-tab-span ...

  2. js中改变this指向的call、apply、bind 方法使用

    前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...

  3. 改变this指向的三种方法

    call.apply.bind三者为改变this指向的方法. 共同点:第一个参数都为改变this的指针.若第一参数为null/undefined,this默认指向window call(无数个参数) ...

  4. 深入理解this和call、bind、apply对this的影响及用法

    首先看一道网易的面试题: var a = { a:"haha", getA:function(){ console.log(this.a); } } var b = { a:&qu ...

  5. 改变函数中的 this 指向——神奇的call,apply和bind及其应用

    在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...

  6. JavaScript 中call()、 apply()、 bind()改变this指向理解

    最近开发的过程中遇到了this指向问题,首先想到的是call().apply().bind()三个方法,有些时候这三个方法确实是十分重要,现在我们就把他们的使用方法及异同点讲解一下. 1.每个函数都包 ...

  7. js 改变this指向的三种方法 bind call apply

    先了解下bind call apply 的注意点 bind 需要手动调用 第一个参数 this 要指向的对象,后面是 散列的参数 call 不需要手动调用 第一个参数 this 要指向的对象,后面是 ...

  8. 有关call和apply、bind的区别及this指向问题

    call和apply都是解决this指向问题的方法,唯一的区别是apply传入的参数除了其指定的this对象之外的参数是一个数组,数组中的值会作为参数按照顺序传入到this指定的对象中. bind是解 ...

  9. js修改函数内部的this指向(bind,call,apply)

    js修改函数内部的this指向 在调用函数的时候偶尔在函数内部会使用到this,在使用this的时候发现并不是我们想要指向的对象.可以通过bind,call,apply来修改函数内部的this指向. ...

随机推荐

  1. Mybatis+SpringBoot 项目All elements are null

    xml文件内容如下 查出来的集合长度是有的,但是会出现All elements are null 解决方案: 注意我的xml文件全部是这样的,并且我调用的sql返回值是  resultType=&qu ...

  2. 【Java面试】RDB 和 AOF 的实现原理、优缺点

    Hi,大家好,我是Mic. 一个工作了5年的粉丝私信我,最近面试碰到很多Redis相关的问题. 其中一个面试官问他Redis里面的持久化机制,没有回答得很好. 希望我帮他系统回答一下. 关于Redis ...

  3. 虚拟机使用docker 外部机器无法访问端口问题

    1,排查防火墙firewall-cmd --state 如果输出的是"not running"则FirewallD没有在运行,且所有的防护策略都没有启动,那么可以排除防火墙阻断连接 ...

  4. Pytorch从0开始实现YOLO V3指南 part5——设计输入和输出的流程

    本节翻译自:https://blog.paperspace.com/how-to-implement-a-yolo-v3-object-detector-from-scratch-in-pytorch ...

  5. RapidEye快鸟、SPOT卫星遥感影像数据

    ​目前地理遥感生态网平台已发布高分辨率卫星遥感影像数据. 数据样例:百度云下载链接:https://pan.baidu.com/s/17ofPwpDM3OCHnE-LuhvUp 提取码:i0m4   ...

  6. MyBatis 映射文件

    Mybatis映射文件简介 1) MyBatis 的真正强大在于它的映射语句.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉 ...

  7. 如何快速体验OneOS

    随便逛了逛 之前有简单了解过OneOS,今天逛了下OneOS专区,发现官方终于也在宣传方面发力了啊,很多文章都非常专业,也有开发者在专区里面提问题了.也发现,部分开发者倒在了第一步,如何编译下载运行O ...

  8. 【USACO 2012 Open】奶牛赛跑_题解

    奶牛赛跑 目录 奶牛赛跑 题目描述 输入格式 输出格式 样例 样例输入#1 样例输出#1 题解 代码 题目描述 约翰有头奶牛,他为这些奶牛准备了一个周长为的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比 ...

  9. Windows 安装 Linux 环境

    简介 在实际开发中,我们除了在Windows上进行开发外,可能还需要基于Linux进行一些编译或者测试等,因此,我们可能需要在Windows环境中安装Linux环境,通常可能我们会使用虚拟机替代,但是 ...

  10. 魔怔愉悦之 Vizing 定理

    Vizing 定理 定义 \(\Delta(G)\) 表示图 \(G\) 的点的最大度数,即 \(\displaystyle\Delta G=\max_{i=1}^{|V|}\deg(i)\) . 边 ...