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. 更强的 JsonPath 兼容性及性能测试之2022版(Snack3,Fastjson2,jayway.jsonpath)

    2022年了,重新做了一份json path的兼容性与性能测试.三个市面上流行框架比较性测试. 免责声明:可能测试得方式不对而造成不科学的结果(另外,机器不同结果会有不同),可以留言指出来.以下测试数 ...

  2. File类获取功能的方法和File类判断功能的方法

    File类获取功能的方法-public String getAbsolutePath() :返回此file的绝对路径名字符串 -public String getPath() :将此File转换为路径 ...

  3. DIY蓝牙hub F1方向盘

    介于已经入手了自己的第一套OWS FFB直驱力反馈方向盘,因此决定要自己做一款F1方向盘盘面,来提升一下F1 2020游戏的游戏体验感.整体的技术路线如下: [技术路线] 主控:esp32 软件环境: ...

  4. Airbnb的动态kubernetes集群扩缩容

    Airbnb的动态kubernetes集群扩缩容 本文介绍了Airbnb的集群扩缩容的演化历史,以及当前是如何通过Cluster Autoscaler 实现自定义扩展器的.最重要的经验就是Airbnb ...

  5. netcore 非注入全局获取配置文件

    在netcore开发中,最常见的就是注入,比如想获取appsettings.json的内容,我们就需要去注入,然后在controller里面去获取,但是我们如果想要在service中使用appsett ...

  6. WPF 截图控件之绘制方框与椭圆(四) 「仿微信」

    前言 接着上周写的截图控件继续更新 绘制方框与椭圆. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 正文 有开发者在B站反 ...

  7. linux 安装 apache+mysql+php

    http://www.cnblogs.com/lufangtao/archive/2012/12/30/2839679.html

  8. goalng-sync/atomic原子操作

    目录 1.go已经提供了锁,为什么还需要atomic原子操作? 2.atomic原子操作为什么比mutex快? 3.CAS 4.互斥锁与原子操作区别 5.原子操作方法 5.1 atomic.AddIn ...

  9. 使用java随机生成有个性的用户名,LOL地名+水浒传,合计2808个有意思的用户名

    * 随机生成用户名 * 取水浒传108好汉名字 * 取LOL地名26个,组合而成 * 一共可以生成2808个不同特色的用户名 如果你在上网的时候,用户名难取的话,这里有很多可选择的用户名,现提供100 ...

  10. 开源有魔力 - DolphinScheduler 的 Apache 之路

    关于 Apache DolphinScheduler社区 Apache DolphinScheduler(incubator) 于17年在易观数科立项,19年3月开源, 19 年8月进入Apache ...