改变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 ...
随机推荐
- C#反编译工具ILSpy 反汇编
ILSpy反编译工具之C#反汇编 1.下载ILspy工具 https://github.com/icsharpcode/ILSpy#ilspy------- 注意: ILspy需要在电脑上安装.N ...
- mysql 5.7 主从复制搭建及原理
1. 主从复制搭建 1.1 环境准备 OS: Ubuntu 18.04 master: 192.168.0.3 slave: 192.168.0.6 1.2 安装依赖包 # Ubuntu apt-ge ...
- Java日常开发的21个坑,你踩过几个?
前言 最近看了极客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...
- java中给某个字段加锁
private String buildLock(String str) { StringBuilder sb = new StringBuilder(str); String lock = sb.t ...
- 扫盲:Kotlin 的泛型
引子 相信总是有很多同学,总是在抱怨泛型无论怎么学习,都只是停留在一个简单使用的水平,所以一直为此而备受苦恼. Kotlin 作为一门能和 Java 相互调用的语言,自然也支持泛型,不过 Kotlin ...
- input输入框输入中文时,监听的input事件 屏蔽拼音状态
$(function () { $('#jh').off().on({ //中文输入开始 compositionstart: function () { cpLock = false; }, //中文 ...
- [LeetCode]129. Sum Root to Leaf Numbers路径数字求和
DFS的标准形式 用一个String记录路径,最后判断到叶子时加到结果上. int res = 0; public int sumNumbers(TreeNode root) { if (root== ...
- [leetcode]75.Sort Color三指针
import java.util.Arrays; /** * Given an array with n objects colored red,white or blue, * sort them ...
- OpenGL投影矩阵(Projection Matrix)构造方法
(翻译,图片也来自原文) 一.概述 绝大部分计算机的显示器是二维的(a 2D surface).在OpenGL中一个3D场景需要被投影到屏幕上成为一个2D图像(image).这称为投影变换(参见这或这 ...
- Spring—SSJ集成&声明式事务管理
1. 课程介绍 1. SSJ集成;(掌握) 2. 声明式事务管理;(掌握) 什么是三大框架 2.1. ssh Struts/Struts2 Spring Hibernate 2.2. ss ...