如何改变函数内部 this 的指向
一、函数内 this 的指向
1、 this 的指向是当调用函数时确定的,调用的方式不同,this 的指向也就不同。
1.1 this 一般是指向调用者。
| 函数类型 | this 的指向 |
| 普通函数 | Window |
| 定时器函数 | Window |
| 立即执行函数 | Window |
| 对象方法 | 对象本身 |
| 构造函数(原型对象) | 实例对象 |
2、改变函数内部 this 指向
常用的 3 种方法:call()、apply()和bind()。
2.1 call('this 指向的对象','参数1','参数2')
- 改变 this 指向,调用自身函数
let obj = {
name:'Coder Yarn';
}; function fn(a,b){
console.log(this);
console.log(a + b);
}; fn.call(obj,2,5); //输出结果
{name:'Coder Yarn';}
7 - 可以实现继承
function Father(username,age,sex){
this.username = username;
this.age = age;
this.sex = sex;
}; function Son(username,age,sex){
Father.call(this,username,age,sex);
}; //实例化对象
let son = new Son('Coder Yarn','22','男');
console.log(son); //结果输出
Coder Yarn
22
男
2.2 apply(thisArg, [argArray])
thisArg: 在 fun 函数运行时指定的 this 值。 argArray:传递的参数,必须包含在数组中
返回值就是函数的返回值,因为他就是调用函数
- 改变 this 指向,调用自身的函数
- 传的参数必须是数组(伪数组)
//通过数学的内置方法求数组的最大值// let arr = [3,55,88,7,9]; let max = Math.max.apply(Math,arr); //this 指向 Math 实例
console.log(max); //输出结果
88
2.3 bind(thisArg,arg1,arg2,....)
thisArg:在 fun() 函数运行时指定的 this 值。 arg1,arg2:传递其他参数
返回由指定的 this 值和初始化参数改造的原函数拷贝,即返回一个新的函数
- 可以改变 this 的指向,但是不能调用自身的函数,只有返回的新函数可以调用自身的函数
let obj = {
name:'Coder Yarn';
}; function fun(a,b){
console.log(this);
console.log(a + b);
}; let newfun = fun.bind(obj,2,3);
newfun(); //输出结果
{name:'Coder Yarn';}
5 - bind() 的应用:函数不需要立即调用,但是想改变函数内部的 this 指向。 如:点击按钮后禁用按钮,经过 1 秒后在启用按钮
//获取 button 按钮元素
let btn = document.querySelector('button'); btn.onclick = function(){
this.disabled = true; //this 指向的是 btn //计时器
setTimeout(function(){
this.disabled = false; //没有 bind() 方法时 this 的指向是 window ,使用 bind() 方法后 this 指向 btn
}.bind(this),1000);
}; //输出结果自己去实现一下吧
三、3 者的区别
- call() 和 apply() 相同点:都会到用自身函数,并且该别函数内部 this 的指向;
- call() 和 apply() 不同点:传入的参数不一样,call 是正常传参,而 apply 必须传入的是数组形式 [];
- bind() 不会调用自身函数,但可以改变函数内部的 this 指向。
如何改变函数内部 this 的指向的更多相关文章
- 改变函数中的 this 指向——神奇的call,apply和bind及其应用
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...
- js修改函数内部的this指向(bind,call,apply)
js修改函数内部的this指向 在调用函数的时候偶尔在函数内部会使用到this,在使用this的时候发现并不是我们想要指向的对象.可以通过bind,call,apply来修改函数内部的this指向. ...
- js函数( 普通函数、箭头函数 ) 内部this的指向
- 普通函数 | 具名普通函数.匿名普通函数,在不作为对象的属性值的情况下,其内部的 this 总是指向代码运行环境下的全局对象 ( 例如,浏览器中的 window ). 示例: (functio ...
- 改变javascript函数内部this指针指向的三种方法
在查了大量的资料后,我总结了下面的三条规则,这三条规则,已经可以解决目前我所遇到的所有问题.规则0:函数本身是一个特殊类型,大多数时候,可以认为是一个变量. function a() { alert( ...
- 函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)
一.函数的定义方式 1.函数声明方式 function 关键字(命名函数) 2.函数表达式(匿名函数) 3.new Function( ) var fn = new Function(‘参数1 ...
- 作用域链和函数内部this指向问题以及bind、call、apply方法
作用域链和函数内部this指向问题以及bind.call.apply方法 作用域链 作用域是相对于变量而言的, 其意义就在与查找变量(确定变量的来处, 变量是否可以访问到, 确定变量在当前位置是否可以 ...
- JS回调函数中的this指向(详细)
首先先说下正常的this指向问题 什么是this:自动引用正在调用当前方法的.前的对象. this指向的三种情况 1. obj.fun() fun中的this->obj,自动指向.前的对 ...
- 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!
看了很多关于阐述JAVA传参到底是值传递还是引用的问题,有些说得很肤浅让人感觉似懂非懂的感觉,但是好像又能解决一些问题,然后就止步了.还有一些则是,讲得很深奥,看着好像很有道理的样子,但是其实还是没怎 ...
- 函数内部的函数中的this都是指向window
刚看到一个问题关于this的, var name="the window"; var object={ name:"silence", packname:fun ...
随机推荐
- IDEA 常用快捷键操作
自定义设置及查询: 操作路径:file-setting-Keymap-Editor actions 右击需要修改的action操作,或者右击Editor actions,选择添加Add Keyboar ...
- 什么是 bean 的自动装配?
Spring 容器能够自动装配相互合作的 bean,这意味着容器不需要和配置,能通 过 Bean 工厂自动处理 bean 之间的协作.
- java-LinkedMap
输入一组数,输出是按每个出现的频率,比如1,3,3,4,5,9,9,9,3,3,输出为3,3,3,3,9,9,9,1,4,5如果频率一样就按原顺序输出. package com.lyb.array;i ...
- Spark学习摘记 —— RDD行动操作API归纳
本文参考 参考<Spark快速大数据分析>动物书中的第三章"RDD编程",前一篇文章已经概述了转化操作相关的API,本文再介绍行动操作API 和转化操作API不同的是, ...
- 为什么HTTP/3要基于UDP?可靠吗?
目录 前言 为什么转用UDP? HTTP/3解决了那些问题? 队头阻塞问题 QPACK编码 Header 参考 推荐阅读: 计算机网络汇总 HTTP/3竟然是基于UDP的!开始我也很疑惑,UDP传输不 ...
- CAN总线系列讲座第六讲——SJA1000的滤波器设置
CAN总线的滤波器设置就像给总线上的节点设置了一层过滤网,只有符合要求的CAN信息帧才可以通过,其余的一概滤除. 在验收滤波器的帮助下,只有当接收信息中的识别位和验收滤波器预定义的值相等时,CAN 控 ...
- 付费漫画下载、付费韩漫下载、漫画VIP下载、VIP韩漫下载哪里下
需要的 来qq:6686496 最近迷上了韩漫(你懂的),主要为了打发时间上班摸鱼,,找了好多网站都是要收费的,就想着试着用爬虫做一个破解. 最简单的第一步,通过url分析出漫画ID.(直接看url就 ...
- Bootstrap 之 Metronic 模板的学习之路 - (1)总览
写在前面 bootstrap 的模板非常多,Envato 上有着各种各样的免费及付费模板.Metronic 是我最喜欢的模板之一(看一眼就喜欢上的那种),当前售价 $28 ,觉得赞的,不妨支持一下作者 ...
- SQL之总结(四)---null问题的处理
概述:如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录.这意味着该字段将以 NULL 值保存. NULL 值的处理方式与其他值不同. NULL 用作未知的或不适 ...
- ES6-11学习笔记--async,await
基于Generator异步编程语法糖:async await async默认输出Promise对象 将异步的代码以同步的方式书写,提高代码可阅读性 基本使用: function timeout() ...