改变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 ...
随机推荐
- Core3.0使用Caching.Memory
前言 参考链接: 使用缓存:https://www.cnblogs.com/gygg/p/11275417.html 过期时间:https://www.cnblogs.com/maijin/p/704 ...
- 每日CSS_仿苹果平滑开关按钮
每日CSS_仿苹果平滑开关按钮 2020_12_24 源码 1. 代码解析 1.1 html 代码解析 <div class="checkbox"> <div c ...
- Java Int类型与字符,汉字之间的转换
/** * java 中的流主要是分为字节流和字符流 * 再一个角度分析的话可以分为输入流和输出流 * 输入和输出是一个相对的概念 相对的分别是jvm虚拟机的内存大小 * 从另一个角度讲Java或者用 ...
- 什么是ZooKeeper?ZooKeeper分布式事务详解
前言 上一章我们了解了zookeeper到底是什么,这一章重点来看zookeeper当初到底面临什么问题? 而zookeeper又是如何解决这些问题的? 实际上zookeeper主要就是解决分布式环境 ...
- react脚手架抽离webpack报错解决
我们在写react项目的时候,可能原有的webpack配置不满足我们的需求,需要自己去配置,可是你在创建脚手架的时候并不能在外部找到webpack文件,脚手架的webpack文件在node_modul ...
- C# 打开Excel文件
方法一:(调用Excel的COM组件) 在项目中打开Add Reference对话框,选择COM栏,之后在COM列表中找到"Microsoft Excel 11.0 Object ...
- ATM管理系统
一.题目要求 编写一个ATM管理系统,语言不限,要求应包括以下主要功能: (1)开户,销户 (2)查询账户余额 (3)存款 (4)取款 (5)转账(一个账户转到另一个账户)等 二.代码提交 开户 pu ...
- Liunx运维(八)-LIunx磁盘与文件系统管理命令
文档目录: 一.fdisk:磁盘分区工具 二.partprobe:更新内核的硬盘分区表信息 三.tune2fs:调整ext2/ext3/ext4文件系统参数 四.parted:磁盘分区工具 五.mkf ...
- 改进你的c#代码的5个技巧(一)
亲爱的读者,在这篇文章中,我提供了一些c#编程的最佳实践. 你是否在用户输入验证中使用异常处理机制? 如果是,那么你就是那个把你的项目执行速度降低了62倍的人.你不相信我吗?等几分钟;我来教你怎么做. ...
- 基于E-PUCK 2.0多智能体自主协同 高频投影定位系统
群体智能机器人是一种国际前沿的人工智能研究项目,由多个小型机器人组成的集群式解决系统,灵感源于蚂蚁.蜜蜂.鱼等群体生物,在没有统一领导的情况下,也能合作执行大量复杂的任务,比如组建一个图形,再在此基础 ...