文章目录

  • 1. 函数的定义和调用
    • 1.1 函数的定义方式
    • 1.2 函数的调用方式
  • 2. this
    • 2.1 函数内this的指向
    • 2.2 改变函数内部this指向
    • 2.3 call apply bind 总结
  • 总结

1. 函数的定义和调用

1.1 函数的定义方式

  1. 函数声明方式function关键字(命名函数)
  2. 函数表达式(匿名函数)
  3. new Function()
var fn = new Function('参数1', '参数2',...,'函数体')
  • Function里面参数都必须是字符串格式
  • 第三种方式执行效率低,也不方便书写,用的比较少
  • 所有函数都是Function的实例(对象)
//函数声明方式
function fn() {}//函数表达式(匿名函数)
var fn = function() {}//利用new Function('arg1','arg2', 'fn')
var f = new Function('a','b',console.log(a+b)')
f(1,2) // 3

所有的函数都是Function实例对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJzzyoaF-1583129073592)(https://cdn.nlark.com/yuque/0/2020/png/148146/1583069785134-c58604dc-ecf6-4d54-8cb6-bd43338329db.png#align=left&display=inline&height=303&name=image.png&originHeight=606&originWidth=1678&size=255639&status=done&style=none&width=839)]

1.2 函数的调用方式

  1. 普通函数
  2. 对象的方法
  3. 构造函数
  4. 绑定事件函数
  5. 定时器函数
  6. 立即执行函数
// 普通函数
function fn() {console.log('前端岚枫博客')
}
fn() //前端岚枫博客//对象的方法
var obj = {say: function () {console.log('前端岚枫博客')}
}
obj.say() //前端岚枫博客//构造函数
function Star() {}
new Star()//绑定的事件函数
btn.onclick = function() {} //点击了按钮就可以调用该函数//定时器函数
setInterval(function() {}, 1000)//立即执行函数
(function() {console.log('前端岚枫博客') //自动调用
})()

2. this

2.1 函数内this的指向

这些this的指向,是当调用函数的时候确定的调用方法的不同决定了this的指向不同,一般指向调用者。
调用方式

调用方式 this指向
普通函数调用 window
构造函数调用 实例对象 原型对象里面的方法也指向实例对象
对象方法调用 该方法所属对象
事件绑定方法 绑定事件对象
定时器函数 window
立即执行函数 window

2.2 改变函数内部this指向

Javascript为提供了一些函数方法来帮助我们更优雅地处理函数内部this的指向问题,常用的有bind()、call()、apply()三种方法。接下来,我们来详细的介绍一下这三种方法的用法,看看它们是如何改变this指向的。

  1. call方法

call()方法调用一个对象,简单理解为调用函数的方式,但是它可以改变函数的this指向。

fn.call(thisArg, arg1, arg2, ...)
var obj = {name: 'lanfeng'
}
function fn(a, b) {console.log(this) console.log(a+b)
}
fn(1,2)//指向window, 3
fn.call(obj, 1, 2) //指向obj, 3//实现继承
function Father(uname, age, sex) {this.uname = unamethis.age = agethis.sex = sex
}
function Son () {Father.call(this,uname, age, sex)
}
var son = new Son('柳岩',18,'女')

call:第一个可以调用函数,第二个可以改变函数内的this指向
call的主要作用可以实现继承

  1. apply方法

apply()方法调用一个函数。简单理解为调用函数的方式,它与call方法一样可以改变函数的this的指向,但是它跟call传参数方式不一样,它是传的参数必须在一个数组里

fun.apply(thisArg, [argsArray])
  • thisArg:在fun函数运行时指定this的值
  • argsArray: 传递的值,必须包含在数组里面
  • 返回值就是函数的返回值,因为它就是调用函数
var obj = {name: 'lanfeng'
}
function fn(a, b) {console.log(this) console.log(a+b)
}
fn(1,2)//指向window, 3
fn.apply(obj, [1, 2]) //指向obj, 3

apply:第一个可以调用函数,第二个可以改变函数内的this指向
apply的参数必须时数组(伪数组)
apply的主要应用,求数数组中的最大值,最小值

var arr = [1, 66, 3, 99, 4]
var max = Math.max.apply(Math, arr)
var min = Math.min.apply(Math, arr)
console.log(max, min) //99 1
  1. bind方法

bind()方法不会调用函数,但是能改变函数内部this指向

fn.bind(thisArg, arg1, arg2, ...)
  • thisArg: 在fn函数运行时指定的this值
  • arg1, arg2: 传递的其他参数
  • 返回由指定的this值和初始化参数改造的原函数拷贝
var obj = {name: 'lanfeng'
}
function fn(a, b) {console.log(this) console.log(a+b)
}
fn(1,2)//指向window, 3
var f = fn.bind(obj, 1, 2)
f()

bind: 不会调原来的函数,可以改变this指向,返回的函数是改变this之后产生的新函数
bind的应用: 如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind

var btn = document.querySelector('button')
//以前的用法
btn.onclick = function() {var that = thisthis.disabled = truesetTimeout(function(){that.disabled = false}, 3000)
}// bind用法
btn.onclick = function() {this.disabled = truesetTimeout(function(){this.disabled = false}.bind(this), 3000)
}

2.3 call apply bind 总结

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

  1. call 和apply 会调用函数,并且改变函数内部的this指向
  2. call和apply传递的参数不一样,call传递参数形式arg1, arg2, …形式,apply必须数组形式
  3. bind不会调用函数,可以改变函数内部的this指向

主要应用场景:

  1. call经常做继承
  2. apply经常跟数组有关系,比如借助于数学对象实现数组的最大值最小值
  3. bind不调用函数,但是还想改变this指向,比如改变定时器的内部this指向

总结

本篇文章主要分享了javascript的函数定义、用法、this及改变this指向的几种方法

带你学习Javascript中的函数进阶(一)相关推荐

  1. 一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域

    作者 | Jeskson 来源 | 达达前端小酒馆 定义函数的方式: 第一种为 函数声明: 第二种为 函数表达式. 语法: function functionName(arg0, arg1, arg2 ...

  2. 带你学习javascript的函数进阶(二)

    上一篇文章分享了<带你学习Javascript中的函数进阶(一)>,今天继续学习javascript的函数进阶的内容. 文章目录 1 严格模式 1.1 什么是严格模式 1.2 开启严格模式 ...

  3. 如何理解并学习javascript中的面向对象(OOP)

    本文不适合javascript初学者看(javascript水平还停留在函数级别的朋友,看了会觉得很晕的).如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的 ...

  4. php断言什么意思,一起学习PHP中断言函数的使用

    一起学习PHP中断言函数的使用 原来一直以为断言相关的函数是 PHPUnit 这些单元测试组件提供的,在阅读手册后才发现,这个 assert() 断言函数是 PHP 本身就自带的一个函数.也就是说,我 ...

  5. JavaScript中的函数是对象?

    函数是第一类对象(first-class object),被称为一等公民.函数与对象共存,我们也可以认为函数就是其他任意类的对象. 那么今天,就让我们一起简单聊一聊JavaScript的函数吧! 目录 ...

  6. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  7. Javascript中的函数重载-最佳做法

    用JavaScript伪造函数重载的最佳方法是什么? 我知道不可能像其他语言一样重载Javascript中的函数. 如果我需要两个函数一起使用foo(x)和foo(x,y,z) ,这是最佳/首选方式: ...

  8. 彻底理解JavaScript中回调函数 (推荐)

    在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply() ...

  9. JavaScript中Exists函数

    JavaScript中Exists函数是如果 Dictionary 对象中存在所指定的主键则返回 true,否则返回 false.使用方法: object.Exists(key) 其中object是必 ...

最新文章

  1. 算法------零钱兑换(Java版本)
  2. 移动web开发DRP问题
  3. redis 类型、方法
  4. Django配置bootstrap
  5. java精通时间_你真的精通 Java 吗?
  6. 多维标度法MDS古典解的证明与R语言实现
  7. 必备天气预报界面APP应用设计灵感,出门瞅一瞅~
  8. python取出矩阵中的某一元素_将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例...
  9. 我如何不再是一个可怕的“10 倍经理”?
  10. SQL函数学习(函数在实际项目中 之 COALESCE)
  11. 如何保持交互的可见性
  12. HenCoder Android开发进阶系列学习笔记
  13. 【二叉树初阶】前中后序遍历+层序遍历+基础习题
  14. Qt发布版权问题,是否需要公开源码?开源版与商业版的区别?
  15. 计算机1M代表什么,1M网速是多少 Mbps是什么意思
  16. HDU 6438 Buy and Resell【贪心】
  17. DBeaver mySQL 远程操作数据库
  18. Unity TimeLine丨A1.创建TimeLine、Animation Track,Extrapolation属性讲解
  19. 2011年恒生电子校园招聘笔试题目
  20. python海洋绘图-Basemap库画地图时,南极洲显示不全

热门文章

  1. Centos7 安装 Rabbitmq、Erlang
  2. go web db每次关闭_竟然不用写代码!一款可视化 Web 管理后台生成工具
  3. imos style android,自定义的第一个view
  4. oracle 提示存在lob,Oracle数据库出现ORA-19566 LOB坏块的处理记录
  5. jQuery获取URL参数
  6. 打开网页到我们看到页面显示的过程中发生了什么?
  7. BZOJ1729: [Usaco2005 dec]Cow Patterns 牛的模式匹配
  8. 去哪儿网2017春招在线笔试
  9. 朴素贝叶斯与贝叶斯网络
  10. 01python初识—编辑器版本变量知识