改变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指向!的更多相关文章

  1. Javascript中函数的四种调用方式

    一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属 ...

  2. javascript中函数声明、变量声明以及变量赋值之间的关系与影响

    javascript中函数声明.变量声明以及变量赋值之间的关系与影响 函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 ...

  3. 了解Javascript中函数作为对象的魅力

    前言 Javascript赋予了函数非常多的特性,其中最重要的特性之一就是将函数作为第一型的对象.那就意味着在javascript中函数可以有属性,可以有方法, 可以享有所有对象所拥有的特性.并且最重 ...

  4. JavaScript中函数函数的定义与变量的声明<基础知识一>

    1.JavaScript中函数的三种构造方式 a.function createFun(){ } b.var createFun=function (){ } c.var createFun=new ...

  5. JavaScript中函数的形参和实参的实现原理剖析

    我们都知道JS里面参数的传递是可以不一样的,比如我们有一个函数: <script type="text/javascript"> function one(a,b,c) ...

  6. JavaScript 中函数节流和函数去抖的讲解

    JavaScript 中函数节流和函数去抖的讲解 我们都知道频繁触发执行一段js逻辑代码对性能会有很大的影响,尤其是在做一些效果实现方面,或者逻辑中需要进行后端请求,更是会导致卡顿,效果失效等结果,所 ...

  7. JavaScript中函数是不能重载原因

    以前有一次写JS插件的时候,由于后台写习惯了,妄想在JS中写重载函数,可惜不能成功,原因花了一点时间记了下来 首先要理解重载的含义:函数返回值不同或者形式参数个数不同但函数名相同的函数 JavasSc ...

  8. JavaScript中函数的调用

    JavaScript中函数的调用 制作人:全心全意 在JavaScript中,函数定义后并不会自动执行,要执行一个函数需要在特定的位置调用该函数,调用函数需要创建调用语句,调用语句包含函数名称和参数. ...

  9. JavaScript中函数的定义

    JavaScript中函数的定义 制作人:全心全意 在JavaScript中,函数是由关键字function.函数名加一组参数以及置于大括号中需要执行的一段代码定义的.定义函数的基本语法格式如下: f ...

随机推荐

  1. 2020 .NET 开发者峰会顺利在苏州落幕,相关数据很喜人以及线上直播回看汇总

    在2019年上海中国.NET开发者大会的基础上,2020年12月19-20日 继续以"开源.共享.创新" 为主题的第二届中国 .NET 开发者峰会(.NET Conf China ...

  2. 探究 position-sticky 失效问题

    CSS 的 position 值中,有一个非常有用的值 -- position: sticky,通常会被用于各种吸顶,吸底,吸边的效果中. 如果你对 sticky 还不太熟悉,可以先看看我的这篇文章: ...

  3. 关于MVC中 服务器无法在发送 HTTP 标头之后修改 cookie此类问题的解决

    处理方法 使用过滤器控制权限时,若无权则跳转到无权页面,但是每次跳转都会出现 ERROR - System.Web.HttpException (0x80004005): 服务器无法在已发送 HTTP ...

  4. UICamera 编辑器与移动设备下的Find异常

    某次出包后,在移动设备下,发现所有的UIDrag和一些UIHUD组件都失效了,看了看Editor下是正常的,后面就做了一系列检查措施来排除问题所在. 1.看了下log日志里是否有相关报错异常,结果毫无 ...

  5. Linux嵌入式学习-ds18b20驱动

    ds18b20的时序图如下: 复位时序: 读写时序: 以下是程序代码: #include <linux/module.h> #include <linux/init.h> #i ...

  6. Redis基础篇(六)数据同步:主从复制

    Redis具有高可靠性,体现在两方面: 一是数据尽量少丢失,通过前面介绍的持久化方式AOF和RDB,在宕机时可以恢复数据. 二是服务尽量少中断,通过副本冗余来实现. 今天我们学习的就是通过主从复制实现 ...

  7. STM32串口中断的一些资料

    在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在这里.以供自己查阅,以及方便其他人. TC ====TXE 顺便预告下最近会写个有关串口处理数据的帖子,从查询和中断方面以及数据处理 ...

  8. JAVA顺序结构和选择结构

    顺序结构 JAVA的基本结构就是顺序结构,除非特别指明,否则按顺序一句一句执行 顺序结构是最简单的算法结构 语句和语句直接,框与框直接就是按从上到下的顺序执行的,它是由若干个依次执行的处理步骤组成的, ...

  9. 浅谈ES6数组及对象的解构

    一.数组的解构,ES6的新特性,主要是方便操作数组,节省不必要的代码,提高代码质量. 上图例子中, example1: 之前想要获取数组中的值,只能挨个获取下标,然后取值 example2:ES6新特 ...

  10. [ABP教程]第五章 授权

    原文档 地址: Web Application Development Tutorial - Part 5: Authorization 关于此教程 在这个教程系列中,您将构建一个基于ABP的Web应 ...