【JavaScript】深度理解js的函数(function、Function)

这篇具有很好参考价值的文章主要介绍了【JavaScript】深度理解js的函数(function、Function)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简言

学了这么久的JavaScript,函数在JavaScript中最常用之一,如果你不会函数,你就不会JavaScript。
函数就是Function对象,一个函数是可以通过外部代码调用的一个“子程序”,它是头等(first-class)对象,因为它们可以像任何其他对象一样具有属性和方法。瞧瞧它的定义,注定它能做很多事情。
**函数是函数名、参数和函数体组成,然后由function声明。**我们一般说函数是指普通函数,还有另一种函数叫做生成器函数,这个生成器比较比较高级,生成器函数在执行时能暂停,后面又能从暂停处继续执行,这里不展开描述。

函数

在 JavaScript 中,每个函数其实都是一个Function对象。函数默认返回undefined

定义函数

声明一个函数(Function对象)有很多种方式。如果一个函数中没有使用 return 语句,则它默认返回undefined。要想返回一个特定的值,可以使用return 返回。

function声明

由function声明的函数,函数名会提升这个作用域的顶部,即在函数定义前也能使用。

function name([param[, param[, ... param]]]) { statements }
  • name 函数名。
  • param 传递给函数的参数的名称。
  • statements 组成函数体的声明语句。

函数表达式

由函数表达式创建的函数,函数名不会会提升,即必须在创建之后使用。

var myFunction = function name([param[, param[, ... param]]]) { statements }
  • name 函数名,可以省略,省略了后是匿名函数。
  • param 传递给函数的参数的名称。
  • statements 组成函数体的声明语句。

立即调用函数(IIFE)

当函数只使用一次时,通常使用IIFE (Immediately Invokable Function Expressions)。意思是当这个js文件被执行时调用一次。

(function () {
  statements;
})();
  • statements 组成函数体的声明语句。

箭头函数表达式(=>)

箭头函数是函数

var fn = ([param] [, param]) => { statements } param => expression
  • param 参数名称。
    零参数需要用 () 表示。只有一个参数时不需要括号。(例如 foo => 1)
  • statements or expression
    多个声明 statements 需要用大括号括起来,而单个表达式时则不需要。表达式 expression 也是该函数的隐式返回值。

Function构造函数 (不推荐)

函数(Function对象)可以用 new 操作符创建。
把 Function 的构造函数当作函数一样调用 (不使用 new 操作符) 的效果与作为 Function 的构造函数调用一样。

new Function (arg1, arg2, ... argN, functionBody)
  • arg1, arg2, … argN
    函数使用零个或多个名称作为正式的参数名称。每一个必须是一个符合有效的 JavaScript 标识符规则的字符串或用逗号分隔的字符串列表,例如“x”,“theValue”或“a,b”。

  • functionBody
    一个构成的函数定义的,包含 JavaScript 声明语句的字符串。

函数参数

函数参数(形参)一个重要的概念,它是函数体与外面作用域交互的媒介或桥梁。普通的参数由js各种类型定义,除此之外,它还有this、剩余参数和arguments对象。

形参

普通的参数由js各种类型定义,定义的参数可以在函数内使用,想传啥就传啥。
调用传参时,则按你定义参数的顺序传。

function fnParams(
  name,
  age = 18,
  object = {
    label: 'object形参',
  },
  fn = () => {},
  date = new Date(),
  arr = []
) {
  console.log(name, age, object, fn, date, arr)
}
fnParams()

调用时不传参数,参数为undefined,有默认值则值为默认值。
【JavaScript】深度理解js的函数(function、Function),JavaScript,javascript,开发语言,ecmascript

arguments对象

arguments 是一个对应于传递给函数的参数的类数组对象。
arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。
箭头函数使用arguments在浏览器环境下会报错。

function fnParams(
  name,
  age = 18,
  object = {
    label: 'object形参',
  },
  fn = () => {},
  date = new Date(),
  arr = []
) {
  console.log(name, age, object, fn, date, arr)
  console.log(arguments)
}
fnParams('zsk', () => {})

const fn = (name) => {
  console.log(name, arguments)
}
fn('zsk')

【JavaScript】深度理解js的函数(function、Function),JavaScript,javascript,开发语言,ecmascript

剩余参数

剩余参数是es6的,剩余参数语法允许我们将一个不定数量的参数表示为一个数组。
如果函数的最后一个命名参数以…为前缀,则它将成为一个由剩余参数组成的真数组,其中从0(包括)到theArgs.length(排除)的元素由传递给函数的实际参数提供。

function(a, b, ...theArgs) {
  // ...
}

如上,theArgs就是剩余参数,它是一个数组,包含那些没有对应形参的实参,默认值[],不能更改默认值。

let fn = function (a, ...args) {
  console.log(a, args)
}
fn(1, 2, 3)

【JavaScript】深度理解js的函数(function、Function),JavaScript,javascript,开发语言,ecmascript

this

在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定)。this 不能在执行期间被赋值,并且在每次函数被调用时 this 的值也可能会不同。可以使用 bind 方法来设置函数的 this 值,而不用考虑函数如何被调用的。箭头函数本身没有this,值为创建时外层上下文对象。

function fn2() {
  console.log('fn2::', this)
  const arrowFn = (a = 1) => {
    console.log('()=>{} ::', this)
  }
  const fn = function (a = 1) {
    console.log('fn::', this)
  }
  arrowFn()
  fn()
  let o = {
    fn: fn,
  }
  o.fn()
}
fn2()

【JavaScript】深度理解js的函数(function、Function),JavaScript,javascript,开发语言,ecmascript
bind()、call() 和 apply()方法可以改变this值。

a = 1
const obj = {
  a: 2,
}
function fn3() {
  // 'use strict'
  console.log(this.a)
  return this
}
fn3()

fn3.bind(obj)()
fn3()
fn3.bind()()
fn3.call(obj, 1, 2)
fn3()
fn3.call()

fn3.apply(obj, [1, 2])
fn3()
fn3.apply()

【JavaScript】深度理解js的函数(function、Function),JavaScript,javascript,开发语言,ecmascript

函数体

函数体没啥说的,什么都可以写。自己都可以调用。。。,递归就是这么来的。
如果有return 的话,可以返回函数,例如实现闭包、函数柯里化、高阶函数等。

函数属性

另外,函数本身还有一些属性和方法:

  • name 返回函数定义的名称。
  • length 只读属性,表示函数形参的个数
  • prototype 函数的原型对象
  • toString() 返回函数完整的源代码字符串

结语

有了函数,js就算玩出花来,也可以有条理性。文章来源地址https://www.toymoban.com/news/detail-809986.html

到了这里,关于【JavaScript】深度理解js的函数(function、Function)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • addEventListener is not a function , JavaScript添加监听事件时报错

    addEventListener is not a function , JavaScript添加监听事件时报错

    简介:在写JavaScript代码的时候,控制台有时候会遇到这样的报错, addEventListener is not a function ,说addEventListener不是一个函数,具体原因是因为监听事件的事件源不对,事件源应该是一个元素,而非其它。 因此我们在获取元素时要注意, getElementsByClassName()、 getElementByTagName

    2024年02月09日
    浏览(5)
  • 什么是JavaScript中的IIFE(Immediately Invoked Function Expression)?它的作用是什么?

    什么是JavaScript中的IIFE(Immediately Invoked Function Expression)?它的作用是什么?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月08日
    浏览(6)
  • python selenium报错:Message: javascript error: arguments[0].click is not a function

    python selenium报错:Message: javascript error: arguments[0].click is not a function

      这是selenium比较常见的报错,所以记录一下解决方法,避免总是忘记。 代码示例: 分析原因 通过debug可以发现,click1并不是一个WebElement,而是一个list 解决方法: 所以把click1改成click1[0],就可以了    

    2024年02月15日
    浏览(12)
  • vue及js中使用function及箭头函数定义方法

    目录 1.函数声明,使用function 2.函数表达式,使用function 3.使用箭头函数方式 4.函数构造器 5.总结 1.函数声明,使用function 2.函数表达式,使用function 3.使用箭头函数方式 4.函数构造器 5.总结 在vue中,我们通过v-on指定来绑定要指定的方法,可以使用function或const箭头函数的方式

    2024年02月05日
    浏览(6)
  • 什么是函数式编程(functional programming)?在JavaScript中如何实现函数式编程的概念?

    什么是函数式编程(functional programming)?在JavaScript中如何实现函数式编程的概念?

    前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

    2024年02月07日
    浏览(8)
  • 【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题

    【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题

    开发 Azure JS Function(NodeJS),使用 mssql 组件操作数据库。当SQL语句执行完成后,在Callback函数中执行日志输出 context.log(\\\" ...\\\") , 遇见如下错误: Warning: Unexpected call to \\\'log\\\' on the context object after function execution has completed. Please check for asynchronous calls that are not awaited or calls to \\\'done\\\' ma

    2024年02月03日
    浏览(13)
  • 深度解析JavaScript递归函数

    深度解析JavaScript递归函数 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在今天的文章中,我们将深入研究JavaScript中一个强大而神秘的编程概念——递归函数。让我们一起探秘递归的魅力,深入了解其

    2024年01月19日
    浏览(7)
  • JavaScript 深度剖析-函数式编程(一)

    JavaScript 深度剖析-函数式编程(一)

    为什么要学习函数编程以及什么是函数式编程 函数式编程的特性(纯函数、柯里化、函数组合等) 函数式编程的应用场景 函数式编程库 Lodash 函数式编程是非常古老的一个概念,早于第一台计算机的诞生,函数式编程的历史。 那我们为什么现在还要学函数式编程? 函数式编程

    2024年02月15日
    浏览(19)
  • JavaScript节流功能(js节流函数,节流功能的应用与解析,深入了解JavaScript节流函数)

    简述:上篇文章介绍了js防抖功能,这期说下js节流功能。节流就是某一高频事件不断被触发时,将多次执行变成每隔一段时间执行,具体点就是减少一个事件在一段时间内的触发频率,它是一种常用的函数优化技术,可以限制函数的执行频率,从而提高网页的性能和用户体验

    2024年02月13日
    浏览(8)
  • function 函数

    function 函数

    f unction函数 的 名字 也是一个 标识符 ,通过 function 申明一个函数 function 函数名(){ 代码块 } 1、形参与实参 可以有 无数个, 实参按照 顺序赋值 给形参; 2、 实参个数 不一定 要与实参个数 相同, 没有实参赋值 的 形参 默认数值为 undefined ; 3、 arguments 能够获取到

    2023年04月12日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包