js的this、bind、call、apply个人领悟
this
1.非箭头函数:
如果是该函数是一个构造函数,this指针指向一个新的对象
在严格模式下的函数调用下,this指向undefined
如果是该函数是一个对象的方法,则它的this指针指向这个对象
2.箭头函数:
- 箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this
总结:普通函数的this指向看调用,箭头函数的this指向看声明,指向声明时候的函数作用域;
setTimeout会延迟函数的声明
bind、call、apply
- bind
- 绑定this不执行(执行时绑定this一次,可新生成函数储存持久型this绑定)
- call
- 绑定this执行n参数任意类型(执行时绑定this一次)
- apply
- 绑定this执行第二个参数必须数组分解依次执行(执行时绑定this一次)
apply实践
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var person1 = {
firstName:"John",
lastName: "Doe"
}
person.fullName.apply(person1, ["Oslo", "Norway"]);//数组内传入前面函数的参数
"John Doe,Oslo,Norway"
this和call结合运用
let a,
barObj = { msg: "bar的this指向" };
fooObj = { msg: "foo的this指向" };
function foo() {
a(); // 结果:{ msg: 'bar的this指向' }
}
function bar() {//箭头函数this绑定在这层(bar)
a = () => {
console.log(this); //箭头函数作用域局限于bar
}; // 在bar输出当前this信息
}
bar.call(barObj); // 改变bar指向barobj执行后 a:输出this的函数
a(); //(当前a输出bar)
foo.call(fooObj); // 将foo的this指向fooObj
/// a为箭头函数输出{msg: "bar的this指向"}
/// a为不箭头函数输出最外层(windows或者其他)
箭头函数和普通函数差异


普通函数的this指哪打哪,箭头函数较特殊在创建的时候就已定死(除非后续再赋值可以改变),图中
function bar() {//箭头函数this绑定在这层(bar)
a = () => {
console.log(this); //箭头函数作用域局限于bar
}; // 在bar输出当前this信息
}
bar.call(barObj)
箭头函数是赋值给了a,由bar调用(谁调用bar就指定死了this,箭头函数this绑定在这个“谁”上),所以这里是bar.call(barObj),绑定在barObj上
箭头函数的this没有绑定b对象成功,貌似永远绑定了barObj(这是箭头函数第一次绑定的地方,后续也没由修改,要修改只能重新赋值a=()=>{console.log(this)}类似这样)
其实自己刚入门的时候就已熟读this指向问题了,但是在综合运用场景或者复杂运用场景才正宗明白如何使用this,所谓实践出真知,工作中一班也不会频繁更改this指向,一般也就一次(初始化的时候),所以很少实践这种场景,coding后对自己提升蛮大的
js的this、bind、call、apply个人领悟的更多相关文章
- js中的bind、apply、call、callee、caller的区别
1.bind.apply与call的区别与使用 相同点:2者是函数原型的一个方法,因此调用者都必须是函数,第1个参数都是对象.作用是,用另一个对象替换当前对象,另一对象也即是你传的第一个参数.通常用于 ...
- js call与bind和apply的区别
介绍 在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢. 在说区别之前还是先总结一下三者的相似之处: 1.都是用来改变函数的this对象的指向的. 2.第一个参数都是thi ...
- JS中的call、apply、bind方法
JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]] ...
- js修改函数内部的this指向(bind,call,apply)
js修改函数内部的this指向 在调用函数的时候偶尔在函数内部会使用到this,在使用this的时候发现并不是我们想要指向的对象.可以通过bind,call,apply来修改函数内部的this指向. ...
- JS中的call()和apply()方法和bind()
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- js 改变this指向的三种方法 bind call apply
先了解下bind call apply 的注意点 bind 需要手动调用 第一个参数 this 要指向的对象,后面是 散列的参数 call 不需要手动调用 第一个参数 this 要指向的对象,后面是 ...
- Bind、Apply、Call三者的区别
1)bind与apply.call 的最大区别就是:bind不会立即调用,其他两个会立即调用 var fn = { _int: function(){return 3}, fun: function( ...
- 自己动手用原生实现 bind/call/apply
大家好!!!注册一年多的第一篇博客. 自我介绍: 本人非计算机专业出身,转行进入前端半年时间,写的东西可能观赏性不强,一起进步吧道友们... 接下来的一段时间, 我都会不定期整理自己理解的js知识点, ...
- js原生函数bind
/*在javascript中,函数总是在一个特殊的上下文执行(称为执行上下文),如果你将一个对象的函数赋值给另外一个变量的话,这个函数的执行上下文就变为这个变量的上下文了.下面的一个例子能很好的说明这 ...
- js中的bind方法的实现方法
js中目前我遇见的改变作用域的5中方法:call, apply, eval, with, bind. var obj = { color: 'green' } function demo () { c ...
随机推荐
- java Scanner输入数字、字符串
package java05; import java.util.Scanner;//1.导包 /* Scanner类的功能,可以实现键盘输入数据,到程序当中 引用类型的一班使用步骤: 1.导包 2. ...
- spring cloud学习笔记五 网关服务zuul
网关服务是指,客户端发送的请求不用直接访问特定的微服务接口,而且是经过网关服务的接口进行交互,网关服务再去到特定的微服务中进行调用. 网关服务的路由功能和Nginx的反向代理一样,所有的服务都先会 ...
- Synchronized和ReentranLock的比较
并发编程最容易遇到的问题就是就是安全问题,因此解决方式有两种 使用同步方法或同步代码块(Synchronized关键字) 使用锁机制(ReentranLock) 同步方法和同步代码块(Synchron ...
- html5 lineTo的使用例子
demo.js function draw(id) { var CANVAS=document.getElementById(id); var context=CANVAS.getContext('2 ...
- C#基础提升系列——C#文件和流
C#文件和流 本文主要是对C#中的流进行详细讲解,关于C#中的文件操作,考虑到后期.net core跨平台,相关操作可能会发生很大变化,所以此处不对文件系统(包括目录.文件)过多的讲解,只会描述出在. ...
- max_length 属性
错误:漏掉了 max_length 属性 ERRORS:users.UserProfile.image: (fields.E210) Cannot use ImageField because Pi ...
- vs code 使用技巧整理
快捷键 Ctrl + Shift + F:在文件夹中搜索; Ctrl + Shift + P:命令面板; Ctrl + Shift + T:重新打开 关闭的编辑页面; Ctrl+Shift+PgUp/ ...
- Navicat Premium 12 如何连接阿里云虚拟主机SQL Server 数据库
这个是一台 阿里云购买云虚拟主机!密码已经重置完毕,现在我们 需要知道 数据连接的地址,数据库名,帐号以及密码. 根据不同的运营商 选择 这里我们选择阿里云 云数据库 SQL Server版本 填写 ...
- 存储系统设计——NVMe SSD性能影响因素一探究竟
目录1 存储介质的变革 2 NVME SSD成为主流 2.1 NAND FLASH介质发展 2.2 软件层面看SSD——多队列技术 2.3 深入理解SSD硬件 3 影响NVME SSD的性能因素 3. ...
- javascript is ths best computer language
alert('javascript is one of the best computer languages')