JavaScript高级 函数进阶

函数的定义方式‘

我们常用的函数定义有两种
一种是自定义函数 也叫命名函数 如下

function fn(){}

一种是函数表达式 也叫匿名函数 如下

var fun = function (){}

但是我们也有第三种方式
利用new关键字创造函数

 var fun = new Function()

我们都知道 函数有参数 和形式体
那么我们用new创造 的函数一定也有参数和函数体
利用new function (参数1 参数2 函数体)
要记住 的是 参数和函数体都需要以字符串的方式
即必须加引号
案例如下
在这里插入图片描述
虽然这种方法很麻烦 性能也差
但是由此我们可以得知
所有函数都是Function(第三种方法展示的函数)的实例( 对象 )
简单总结为
函数也是一个对象

函数的调用方式

//  1 普通函数调用
    function fn(){
      console.log('好困');
    } 
    fn();
    fn.call()
    // 2 对象中的函数
    var obj = {
           say : function(){
             console.log('好困');
           }
    }
    // 3 构造函数
      function Say(){
     
      }
      new Say();
    // 4 绑定事件
    btn.onclick = function(){}
    // 5 定时器函数
    setInterval(function() {
      
    }, 1000);
    ###  6 立即执行函数
    (function () {
      
    })()

函数中的this指向问题

对应上面的调用函数的方式
如下图所示
在这里插入图片描述

改变this的指向

call方法

call()方法可以调用函数 可以简单的理解为调用函数的方式
也可以改变函数的this的指向
语法如下
需要改变指向的函数.call(改变的this指向,参数1 , 参数2)

我们知道 普通函数的this指向window
我们创建一个普通函数 打印它的this 并调用
在这里插入图片描述
接着我们使用call方法改变 this指向 并加入参数

fn.call(x,2,3)

在这里插入图片描述
call() 还有一个注意作用是用来继承
如下

function Father(uname, age) {
        this.uname = uname;
        this.age = age;
      }
      function Son(uname, age, sex) {
        Father.call(this, uname, age);
        this.sex = sex;
      }

apply()

apply()方法和call()方法类似
可以调用函数 和改变this的指向
语法如下
需要改变指向的函数.apply(thisArg,[argsArray])
thisArg 在fun函数运行时指定的this值
argsArray 传递的值 必须包含在数组里面
返回值就是函数的返回值 因为它调用了函数
案例如下
在这里插入图片描述

apply()方法主要应用于将数组利用于其他数据的类型的方法

比如说我们有一个数字型的方法 Math.max 我们想数组求最大值

我们就可以利用apply()来解决这个问题

在这里插入图片描述

bind()

bind()方法不会调用函数 但是也可以改变内部的this指向
语法:
需要改变this指向的函数.bind(改变的this值,参数1,参数2)
返回由指定的this值和初始化函数改造的 原函数拷贝
案例如下

在这里插入图片描述

bind()方法的应用

bind()方法看似麻烦 其实是我们实际开发中最方便常用的
案例如下
我们有一个按钮 当我们点击后禁用三秒

  <button>点击</button>
 

  <script>
    var btn = document.querySelector('button');
    btn.onclick = function(){
      this.disabled = true;
      setTimeout(function(){
        this.disabled = false;
      }.bind(this),3000)
    }
  </script>

三种方法的区别

相同点 : 都可以改变函数内部的this指向

区别点 call 和apply 都会调用函数 并且改变函数内部this的指向
call和appky会传递的参数不一样 call传递的是参数 但是apply传递参数必须以数组的形式
bind不会调用函数

call主要用来做继承
apply经常和数组有关系
bind不调用函数 但是还想改变this指向 比如改变定时器中的this指向

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值