改变JavaScript中函数的内部this指向!
改变JavaScript中函数的内部this指向!
第一种方法 call
call 可以 调用函数 + 改变函数内的this指向!
var obj = {
name: 'lvhang'
}
function fun(a, b) {
console.log(this);
console.log(a + b)
}
// 需求, 让fun函数中的this指向obj对象!还可以进行参数传递!
fun(obj, 4, 6);

call 主要作用可以实现继承!
// call 主要作用可以实现继承!
function Father(uname, age, gender) {
this.uname = uname;
this.age = age;
this.gender = gender;
}
function Son(uname, age, gender) {
Father.call(this, uname, age, gender);
}
var son = new Son('name', 'age', 'gender');
console.log(son)

第二种方法 apply 方法
1 apply 调用函数 + 改变函数内的this指向!
2 第二个参数是一个数组!伪数组!你必须以一个数组的形式传过去才可以!
3 apply 的主要应用比如说我们可以利用apply 借助于数学内置对象求最大值和最小值!
// apply 方法!应用 运用的意思!
// 第一个参数还是this的指向!
var obj2 = {
name: 'lvchengxin'
}
function fun2(arr) {
console.log(this);
console.log(arr);
}
fun2.apply(obj2, ['lvhang'])
// 1 apply 调用函数 + 改变函数内的this指向!
// 2 第二个参数是一个数组!伪数组!你必须以一个数组的形式传过去才可以!
// 3 apply 的主要应用比如说我们可以利用apply 借助于数学内置对象求最大值和最小值!
// Math.MAX();
var arr = [12,44,6,565,334];
// var res = Math.max.apply(null, arr)
// 但是this指向为空是不太合适的!应该是谁调用他就指向谁!Math
var res = Math.max.apply(Math, arr);
var res2 = Math.min.apply(Math, arr);
console.log(res, res2);

他和call 的不同之处就在于 他接受的参数必须是一个数组!
第三种方法 bind 方法
不会调用函数, 但是能够改变函数内部的this指向!
参数是和call一样的!
返回值是指定的this初始值和初始化参数改造的原函数拷贝!也就是返回的是原函数改变this之后产生的新函数!
// bind 方法
var obj3 = {
name: 'lvchengxin'
}
function fun3(a, b) {
console.log(this);
console.log(a + b);
}
var f = fun3.bind(obj3, 3, 4)
f();
// 不会调用函数, 但是能够改变函数内部的this指向!
// 参数是和call一样的!
// 返回值是指定的this初始值和初始化参数改造的原函数拷贝!也就是返回的是原函数改变this之后产生的新函数!
// 但是bind 和apply 和 call 不同的是 他不会调用函数!

但是bind 和apply 和 call 不同的是 他不会调用函数!
call apply bind总结
相同点:
都可以改变函数内部的this指向.
区别点:
1. call 和apply会调用函数,并且改变函数内部this指向.
2. call 和apply传递的参数不一样call传递参数aru1, aru2.形式apply必须数组形式[arg]
3. bind 不会调用函数,可以改变函数内部this指向.
主要应用场景:
4. call 经常做继承
5. apply 经常跟数组有关系比如借助于数学对象实现数组最大值最小值
6. bind 不调用函数,但是还想改变this指向.比如改变定时器内部的this指向.
apply使用频率是最高的!
<button>bind方法是最常用的!</button>
<script>
// 我们有一个按钮,当我们点击了之后,就禁用这个按钮, 3秒钟之后开启这个按钮
var btn = document.querySelector('button');
// btn.addEventListener('click', function() {
// this.disabled = true;
// // 原始做法
// var that = this;
// setTimeout(function() {
// that.disabled = false;
// }, 3000)
// })
// btn.addEventListener('click', function() {
// this.disabled = true;
// // 原始做法
// var that = this;
// setTimeout(function() {
// that.disabled = false;
// }, 3000)
// })
// btn.addEventListener('click', function() {
// this.disabled = true;
// // 给函数绑定bind方法!
// setTimeout(function() {
// this.disabled = false;
// }.bind(btn), 3000)
// })
btn.addEventListener('click', function() {
this.disabled = true;
// 给函数绑定bind方法!
setTimeout(function() {
this.disabled = false;
}.bind(this), 3000)
})
改变JavaScript中函数的内部this指向!的更多相关文章
- Javascript中函数的四种调用方式
一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属 ...
- javascript中函数声明、变量声明以及变量赋值之间的关系与影响
javascript中函数声明.变量声明以及变量赋值之间的关系与影响 函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 ...
- 了解Javascript中函数作为对象的魅力
前言 Javascript赋予了函数非常多的特性,其中最重要的特性之一就是将函数作为第一型的对象.那就意味着在javascript中函数可以有属性,可以有方法, 可以享有所有对象所拥有的特性.并且最重 ...
- JavaScript中函数函数的定义与变量的声明<基础知识一>
1.JavaScript中函数的三种构造方式 a.function createFun(){ } b.var createFun=function (){ } c.var createFun=new ...
- JavaScript中函数的形参和实参的实现原理剖析
我们都知道JS里面参数的传递是可以不一样的,比如我们有一个函数: <script type="text/javascript"> function one(a,b,c) ...
- JavaScript 中函数节流和函数去抖的讲解
JavaScript 中函数节流和函数去抖的讲解 我们都知道频繁触发执行一段js逻辑代码对性能会有很大的影响,尤其是在做一些效果实现方面,或者逻辑中需要进行后端请求,更是会导致卡顿,效果失效等结果,所 ...
- JavaScript中函数是不能重载原因
以前有一次写JS插件的时候,由于后台写习惯了,妄想在JS中写重载函数,可惜不能成功,原因花了一点时间记了下来 首先要理解重载的含义:函数返回值不同或者形式参数个数不同但函数名相同的函数 JavasSc ...
- JavaScript中函数的调用
JavaScript中函数的调用 制作人:全心全意 在JavaScript中,函数定义后并不会自动执行,要执行一个函数需要在特定的位置调用该函数,调用函数需要创建调用语句,调用语句包含函数名称和参数. ...
- JavaScript中函数的定义
JavaScript中函数的定义 制作人:全心全意 在JavaScript中,函数是由关键字function.函数名加一组参数以及置于大括号中需要执行的一段代码定义的.定义函数的基本语法格式如下: f ...
随机推荐
- ADF 第六篇:Copy Data Activity详解
在Azure 数据工程中,可以使用Copy Data 活动把数据从on-premises 或云中复制到其他存储中.Copy Data 活动必须在一个IR(Integration Runtime)上运行 ...
- DataTable添加checkbox实现表格数据全选,单选(点选)
Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 分页,即时搜索和排序 几乎支持任何数据源:DOM, javascript, Ajax ...
- idea 【Maven Projects # Profiles】问题记录
今天启动接一个新项目,然后项目启动后发现启动的环境和预想的不一致,查看 pom 文件确认自己是 dev 无误之后,但是启动的就是 test 环境. 问题 发现了启动环境不对不对之后,自己试了一种解决办 ...
- MybatisPlus学习(四)条件构造器Wrapper方法详解
文章目录 1.条件构造器 2.QueryWrapper 2.1.eq.ne 2.2.gt.ge.lt.le 2.3.between.notBetween 2.4.like.notLike.likeLe ...
- idea2020 没有 Autoscroll from Source
2018版本: 2020版本: 最后在官网的网站中找到了解决方案,原来是改名了: 网址:https://intellij-support.jetbrains.com/hc/en-us/communit ...
- Java学习日报8.5
package student;import java.util.*;public class student { Scanner sc=new Scanner(System.in); private ...
- [标签] Java学习日报7.28
package minG;import java.util.*;public class MinG { public static void main(String[] args) { // TODO ...
- spring boot(一):什么是spring boot
什么是spring boot 官网说的很清晰 一.Overview Spring Boot makes it easy to create stand-alone, production-grade ...
- 震惊!java中日期格式化的大坑!
前言 我们都知道在java中进行日期格式化使用simpledateformat.通过格式 yyyy-MM-dd 等来进行格式化,但是你知道其中微小的坑吗? yyyy 和 YYYY 示例代码 @Test ...
- Solon rpc 之 SocketD 协议 - 消息加密模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...