this的指向问题、bind/call/apply改变this指向
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指向的更多相关文章
- call()与apply() 改变this指向
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #a5b2b9 } span.Apple-tab-span ...
- js中改变this指向的call、apply、bind 方法使用
前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...
- 改变this指向的三种方法
call.apply.bind三者为改变this指向的方法. 共同点:第一个参数都为改变this的指针.若第一参数为null/undefined,this默认指向window call(无数个参数) ...
- 深入理解this和call、bind、apply对this的影响及用法
首先看一道网易的面试题: var a = { a:"haha", getA:function(){ console.log(this.a); } } var b = { a:&qu ...
- 改变函数中的 this 指向——神奇的call,apply和bind及其应用
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...
- JavaScript 中call()、 apply()、 bind()改变this指向理解
最近开发的过程中遇到了this指向问题,首先想到的是call().apply().bind()三个方法,有些时候这三个方法确实是十分重要,现在我们就把他们的使用方法及异同点讲解一下. 1.每个函数都包 ...
- js 改变this指向的三种方法 bind call apply
先了解下bind call apply 的注意点 bind 需要手动调用 第一个参数 this 要指向的对象,后面是 散列的参数 call 不需要手动调用 第一个参数 this 要指向的对象,后面是 ...
- 有关call和apply、bind的区别及this指向问题
call和apply都是解决this指向问题的方法,唯一的区别是apply传入的参数除了其指定的this对象之外的参数是一个数组,数组中的值会作为参数按照顺序传入到this指定的对象中. bind是解 ...
- js修改函数内部的this指向(bind,call,apply)
js修改函数内部的this指向 在调用函数的时候偶尔在函数内部会使用到this,在使用this的时候发现并不是我们想要指向的对象.可以通过bind,call,apply来修改函数内部的this指向. ...
随机推荐
- [.NET6]使用ML.NET+ONNX预训练模型整活B站经典《华强买瓜》
最近在看微软开源的机器学习框架ML.NET使用别人的预训练模型(开放神经网络交换格式.onnx)来识别图像,然后逛github发现一个好玩的repo.决定整活一期博客. 首先还是稍微科普一下机器学习相 ...
- 52 条 SQL 语句性能优化策略,建议收藏
本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...
- NC20565 [SCOI2009]生日礼物
NC20565 [SCOI2009]生日礼物 题目 题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有 \(N\) 个,分为 \(K\) 种.简单的说,可以将彩带考虑为 \(x\) ...
- P6622 信号传递 做题感想
题目链接 前言 在这里分享两种的做法. 一种是我第一直觉的 模拟退火.(也就是骗分) 还有一种是看题解才搞懂的神仙折半搜索加上 dp . 模拟退火 众所周知,模拟退火 是我这种没脑子选手用来骗分的好算 ...
- RapidEye快鸟、SPOT卫星遥感影像数据
目前地理遥感生态网平台已发布高分辨率卫星遥感影像数据. 数据样例:百度云下载链接:https://pan.baidu.com/s/17ofPwpDM3OCHnE-LuhvUp 提取码:i0m4 ...
- manjaro 安装后的基本配置
第一步:设置官方镜像源 sudo pacman-mirrors -i -c China -m rank # 输入以上命令后会有弹出框,选择一个国内镜像(推荐 https://mirrors.ustc. ...
- APISpace 让你快速获取安徒生童话故事
<安徒生童话>是丹麦作家安徒生创作的童话集,共由166篇故事组成.该作爱憎分明,热情歌颂劳动人民.赞美他们的善良和纯洁的优秀品德:无情地揭露和批判王公贵族们的愚蠢.无能.贪婪和残暴. 接口 ...
- (一)java基础篇-----认识java
1.简单介绍java起源: 1995年,詹姆斯-高斯林在sun公司开发出java编程语言.到2010年,sun公司被Oracle公司收购,而詹姆斯-高斯林也离开了Oracle公司.所以,如今想要安转j ...
- Android开启OTG功能/USB Host API功能
Android USB 模式简介 设备模式 当计算机或其他USB主机需要连接安卓设备时,此时安卓设备是作为"USB设备"角色的,在计算机上显示为 USB 外设.现在的安卓设备已经被 ...
- python jinjia2 使用语法
简介 对于jinjia2来说,模板仅仅是文本文件,可以生成任何基于文本的文件格式,例如HTML.XML.CSV.LaTex 等等,以下是基础的模板内容: <!DOCTYPE html> & ...