改变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 ...
随机推荐
- CentOS8/Windows 安装RabbitMQ
Centos8安装rabbitmq 1.安装erlang(rabbitmq是用erlang语言开发的,erlang版本需要22.x以上) yum install erlang 2.下载rabbitmq ...
- c# 递归 yield关键字的用法
1.yield实现的功能 yield return: 先看下面的代码,通过yield return实现了类似用foreach遍历数组的功能,说明yield return也是用来实现迭代器的功能的. u ...
- vue-style-loader源码初步分析
背景: 首先声明一下,我只是个菜鸡,为了解决问题才去看的源码,解决完问题之后也就没有兴趣看其他部分代码了,所以这篇文章是一次很低层次的解读,角度也相当片面,想必会有很多喷点吧. 事情的经过是这样,今年 ...
- CentOS7 实战部署tomcat网站服务器
简介:实战演练tomcat网站服务器的搭建 Tomcat:是一个开源免费的Web应用服务器,性能稳定,是目前比较流行的Web应用服务器 tomcat官网下载: https://tomcat.apa ...
- 手把手教你实现自定义Spring Boot的 Starter
引言 上篇文章<天天用SpringBoot,它的自动装配原理却说不出来>我们有说springBoot的自动装配怎么实现的(建议最好先看下篇文章,因为前后有关系),这篇文章的话我们就自己来实 ...
- 请问如何用LoadRunner进行测试。
1.建立测试计划,确定测试标准和测试范围 2.设计典型场景的测试用例,覆盖常用业务流程和不常用的业务流程等 3.根据测试用例,开发自动测试脚本和场景: 录制测试脚本:新建一个脚本(Web/HTML协议 ...
- HTTP ERROR400的问题解决
今天写添加功能,在点添加提交时报了一个"HTTP ERROR 400"的错误,如图, 请求提交的代码死活跳转不到后台,郁闷中,开启debug功能,开始一步步排查, 1.先单独把跳转 ...
- 解决Github下载仓库慢的正确姿势
上个月刚安装了 Manjaro ,然后最近在Manjaro下载Github的项目竟然只有几十b/s,这能忍?对于下载Github上的代码是硬需求,没办法直接探索一下突破的方法了. 方法一:安装chro ...
- 杭电1720---A+B Coming(技巧:使用%x)
Problem Description Many classmates said to me that A+B is must needs. If you can't AC this problem, ...
- Spring(3) --事务,隔离级别,设计模式
什么是事务?事物的四大特性? 事务是指单个逻辑工作单元执行的一系列操作(ACID),这些操作要么全部执行,要么全部不执行,是不可中断的. (1)原子性(Atomicity)是指事务所有操作是不可中断的 ...