首页 > 其他分享 >改变this的指向

改变this的指向

时间:2022-11-12 18:24:29浏览次数:44  
标签:函数 指向 对象 bind 改变 call apply

this

概述:this是一个特殊的对象,他类似于一个指针会指向对应的对象。(在对象的函数内那么对应的this就指向这个对象,在外面的函数内this就指向最顶层的对象window)。this指向当前调用者

对 this 的理解, 三种改变 this 的方式 ?

1.任何情况下直接在script中写入的this都是window。 2.函数中的this 非严格模式:this指向window, 严格模式时:this指向undefined。 3.箭头函数的this       this都指向箭头函数外上下文环境的this指向 4.对象中this 对象属性的this 指向对象外上下文环境的this 对象方法(普通函数)中的this,指向当前对象(谁执行该方法,this就指向谁) 5.回调函数的this指向
  • 1)、 setTimeout,setInterval回调函数不管是否是严格模式都会指向window。
  • 2)、通过在函数内执行当前回调函数 非严格模式:this指向window, 严格模式时:this指
  • 向undefined。
  • 3)递归函数中的this 非严格模式:this指向window, 严格模式时:this指向undefined。
  • 4) 使用arguments 0执行函数时 this指向arguments。
  • 5)事件中的回调函数,this指向事件侦听的对象(e.currentTarget);
6、call,apply,bind方法执行时this的指向
  • 如果call,apply,bind传参时,第一个参数传入的不是null或者undefined,传入什么this指向什么
  • 如果第一个参数传入的是null或者undefined ,非严格模式下指向window
7、在ES6的类中this的指向
  • 构造函数中的this指向实例当前类所产生的新的实例对象
  • 类中实例化方法中this指向谁执行该方法,this指向谁
  • 类中静态方法中this执行该类或者该类的构造函数
  • 类中实例化箭头方法,this仍然指向当前类实例化的实例对象
8、ES5的原型对象中this的指向
  1. 在原型的方法中,this指向实例化当前构造函数的实例化对象(谁执行该方法,this指向谁);
  2. 三种改变this指向的方式
  • 函数名.call(this,....)this写谁就指谁。
  • 函数名.apply(this,[参数1,参数2,...]) this写谁就指谁。
  • 函数名. bind (this,1,2,3) this写谁就指谁。
 

ES5新增改变this指向新增方法

this指向
  • this在函数内的this指向当前函数的调用的者(全局调用的函数this指向window)

  • this在对应的对象内的函数指向当前的对象的

  • this在事件对应的函数内指向当前事件的目标元素

如果需要更改this指向那么我们可以给对应的函数调用对应的方法

相关方法
  • bind (手动调用)

  • apply (自动调用 传递一个数组)(* 如果传递的是数组)

  • call (自动调用 一个个的数据传递)(* 一般常用)

function fn(arg,arg1){
    console.log(this);
    console.log(arg,arg1);
}
fn() //打印window
var obj = {name:'jack'}
//调用bind方法来更改this指向
//将对应的函数绑定给obj这个对象 bind不会执行函数
//函数调用的bind方法返回的是一个函数 这个函数不会自动调用 需要你手动调用
var v = fn.bind(obj)
//执行函数
v()
//bind方法运用 需要手动调用需要()来调用 传参传入到对应的()里面
fn.bind(obj)('你好','世界')
//apply 自动调用 第一个参数是绑定的对象 第二个参数是传递的参数(以数组进行传递)
fn.apply(obj,['hello','world'])
//call 自动调用  第一个参数是绑定的对象 第二个参数是传递的参数 (以一个个的元素进行传递)
fn.call(obj,'吃饭了吗','睡觉了吗')
apply方法和call方法的区别
  • apply方法传递的参数以数组形式

  • call方法传递的参数以元素形式

共同点
  • apply方法和call方法都会自动调用对应的函数

 

 

更改this指向的三个方法

普通方法
1.call() 方法
var Person = {
name:"lixue",
age:21
}
function fn(x,y){
console.log(x+","+y);
console.log(this);
}
fn("hh",20);


this指向

 

var Person = {
name:"lixue",
age:21
}
function fn(x,y){
console.log(x+","+y);
console.log(this);
console.log(this.name);
console.log(this.age);
}
fn.call(Person,"hh",20);

现在this就指向person了

2.apply() 方法


apply() 与call()非常相似,不同之处在于提供参数的方式,apply()使用参数数组,而不是参数列表

3.bind()方法

bind()创建的是一个新的函数(称为绑定函数),与被调用函数有相同的函数体,当目标函数被调用时this的值绑定到 bind()的第一个参数上

 

this指向调用者 在对象里面的函数调用者为对象 在外边的函数调用者为window(global对象 顶层对象)

 

标签:函数,指向,对象,bind,改变,call,apply
From: https://www.cnblogs.com/hofenglang/p/16827362.html

相关文章

  • javascript基础 this指向
    this指向:this永远指向一个对象;this的指向完全取决于函数调用的位置;场景1:在全局环境中调用,this指向window对象vara='a'functionfoo(){console.log(this.a)......
  • [JavaScript-10]this指向
    1.默认绑定//全局环境指向windowconsole.log(this);//函数独立调用,函数内部this指向windowfunctionfn(){console.log(this);}fn();//函数当做对象方法......
  • 【转】C#用WMI改变系统打印机属性
    本文以如何将系统打印机属性中“保留打印的文档”打勾为例,来讲解C#如何简单使用WMI来获得系统属性以及改变系统属性。一、“保留打印的文档”在哪里?打开控制面板->设备和......
  • c#禁止通过拖动,双击标题栏改变窗体大小
    最近写windows窗体程序,发现一个烦人的问题。窗体初始化时禁用了最大化按钮,并使之最大化。本希望窗体一直保持最大化。但是拖动,双击标题栏时窗体就会缩小。烦死了+_+。最后,终......
  • addEventListener 监听不到 改变后的全局变量的值
    问题原因:addEventListener和data的作用域不一样,以及 addEventListener里面拿的永远是最初的数据。解决方法:用ref来存储数据,让需要的数据保持最新需求:监听页面点......
  • 通过css 改变通过img标签引入的svg颜色
    前言修改svg颜色,一般直接修改文件的svg的fill属性就可以了,可以直接改svg属性,也可以通过css修改,但是前端一般都是通过img标签直接引入的svg图片,这样不管是从后期维护还是代......
  • vue中改变数组对象属性名
    data:{年:2022,数量:'8000'},//把data下的年改为年份,数量改为数据量data:{年份:2022,数据量:'8000'},思路:1.遍历Json数组;2.将数组每一......
  • 【面试题】说说JS中的this指向问题
    JS中的this指向问题this的指向问题全局作用域在JS中,全局的变量和函数附着在​​global​​​对象上,全局对象在浏览器环境下是​​window​​对象。在全局作用域中,​​this​......
  • 野花--input获取焦点,改变父元素,改变兄弟元素,不使用js来实现
    :focus-within:focus-within是一个CSS伪类,表示一个元素获得焦点,或该元素的后代元素获得焦点。换句话说,元素自身或者它的某个后代匹配:focus伪类。(shadowDOM树(en-U......
  • 如何确定 this 指向?改变 this 指向的方式有哪些?
    this指向:1.全局上下文(函数外)无论是否为严格模式,均指向全局对象。注意:严格模式下全局对象为undifined2.函数上下文(函数内)默认的,指向函数的调用对象,且是最直接的调......