一、函数内 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 的指向的更多相关文章

  1. 改变函数中的 this 指向——神奇的call,apply和bind及其应用

    在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...

  2. js修改函数内部的this指向(bind,call,apply)

    js修改函数内部的this指向 在调用函数的时候偶尔在函数内部会使用到this,在使用this的时候发现并不是我们想要指向的对象.可以通过bind,call,apply来修改函数内部的this指向. ...

  3. js函数( 普通函数、箭头函数 ) 内部this的指向

    - 普通函数   | 具名普通函数.匿名普通函数,在不作为对象的属性值的情况下,其内部的 this 总是指向代码运行环境下的全局对象 ( 例如,浏览器中的 window ). 示例: (functio ...

  4. 改变javascript函数内部this指针指向的三种方法

    在查了大量的资料后,我总结了下面的三条规则,这三条规则,已经可以解决目前我所遇到的所有问题.规则0:函数本身是一个特殊类型,大多数时候,可以认为是一个变量. function a() { alert( ...

  5. 函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)

    一.函数的定义方式 1.函数声明方式 function  关键字(命名函数) 2.函数表达式(匿名函数) 3.new  Function( ) var  fn = new  Function(‘参数1 ...

  6. 作用域链和函数内部this指向问题以及bind、call、apply方法

    作用域链和函数内部this指向问题以及bind.call.apply方法 作用域链 作用域是相对于变量而言的, 其意义就在与查找变量(确定变量的来处, 变量是否可以访问到, 确定变量在当前位置是否可以 ...

  7. JS回调函数中的this指向(详细)

    首先先说下正常的this指向问题 什么是this:自动引用正在调用当前方法的.前的对象. this指向的三种情况 1. obj.fun()     fun中的this->obj,自动指向.前的对 ...

  8. 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!

    看了很多关于阐述JAVA传参到底是值传递还是引用的问题,有些说得很肤浅让人感觉似懂非懂的感觉,但是好像又能解决一些问题,然后就止步了.还有一些则是,讲得很深奥,看着好像很有道理的样子,但是其实还是没怎 ...

  9. 函数内部的函数中的this都是指向window

    刚看到一个问题关于this的, var name="the window"; var object={ name:"silence", packname:fun ...

随机推荐

  1. MySQL面试题--常见的四种隔离级别

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

  2. 什么是bean的自动装配?

    Spring 容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作.

  3. memcached 能接受的 key 的最大长度是多少?

    key 的最大长度是 250 个字符.需要注意的是,250 是 memcached 服务器端内 部的限制,如果您使用的客户端支持"key 的前缀"或类似特性,那么 key(前缀 + ...

  4. 学习ansible(一)

    1.介绍 1 ansible基于Python开发的自动化运维工具 2 ansible基于ssh协议实现远程管理的工具,没有客户端 3 ansible软件可以实现多种批量管理操作 2.环境 主机 IP ...

  5. github 编写README时常用的写法

    参考:https://github.com/HeTingwei/ReadmeLearn#%E7%BC%96%E5%86%99readme%E6%97%B6%E5%B8%B8%E7%94%A8%E7%9 ...

  6. centos 后台 运行jar包方法

    后台运行jar包方法: 1.nohup java -jar shareniu.jar & nohup意为后台不挂断运行,与是否账号退出无关 2.nohup java -jar shareniu ...

  7. 滑动窗口法——Leetcode例题

    滑动窗口法--Leetcode例题(连更未完结) 1. 方法简介 滑动窗口法可以理解为一种特殊的双指针法,通常用来解决数组和字符串连续几个元素满足特殊性质问题(对于字符串来说就是子串).滑动窗口法的显 ...

  8. CSS入门指南-4:页面布局

    这是<CSS设计指南>的读书笔记,用于加深学习效果. display 属性 display是 CSS 中最重要的用于控制布局的属性.每个元素都有一个默认的 display 值.对于大多数元 ...

  9. template7入门教程及对它的一些看法

    template7是framework7的内置模板引擎,在此之前使用过jquery-tmpl,不过刚刚打开github看了下,已经停止更新,并且将要被JsRender所替代.妹的,JsRender又是 ...

  10. 前端网络安全——前端XSS

    XSS攻击:Cross Site Scripting(跨站脚本攻击) XSS攻击原理:程序+数据=结果,如果数据中包含了一部分程序,那么结果就会执行不属于站点的程序. XSS攻击能干什么?能注入Scr ...