高级程序设计:第7章-函数表达式

函数表达式是JavaScript中的一个既强大又容易令人困惑的特性。

定义函数表达式的方法

1.函数声明

function functionName(arg0,arg1,arg2){
    //函数体
}

先有function关键字,然后是函数的名字,就是指定函数名的方式。他还有一个重要特征就是函数声明提升意思是在执行代码之前会先读取函数声明。(意味可以将函数声明放在调用它的语句后面)如下:

sayHi()
function sayHi(){
    alert("Hi!");
}

2.函数表达式

函数表达式有几种不同的语法形式,下面是最常见的一种。

var functionName=function(arg0,arg1,arg2){
    //函数体
}

创建一个函数并将它赋值给变量functionName,创建的函数叫做匿名函数,因为function关键字后面没有标识符。(匿名函数也叫做拉姆达函数) 匿名函数的name属性是空字符串。

递归

递归函数是在一个函数通过名字调用自身的情况下构成的如下:

function factorial(num){
    if(num<=1){
        return 1;
    }else{
        return num*factorial(num-1);
    }
}

1.arguments.callee是一个指向正在执行的函数的指针,因此可以用来实现对 函数的递归调用如下:

function factorial(num){
    if(num<=1){
        return 1;
    }else{
        return num*arguments.callee(num-1);
    }
}

用arguments.callee代替函数名,可以确保无论怎样调用函数都不会出问题。但是在严格模式下访问arguments.callee属性会出错。可以使用命名函数表达式来达到相同的结果。如下:

var factorial=(function f(num){
    if(num<=1){
        return 1;
    }else{
        return num*f(num-1);
    }
}

这种方式在严格模式和非严格模式都可以使用。

闭包

闭包是指有权访问另一个函数作用域的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数。如下:

function init(){
    var name="Mike";
    function displayName(){
        alert(name);
    }
    displayName();
}
init()

init()函数创建了一个局部变量name和一个名为displayName()的函数。displayName()函数是定义在init()里面的内部函数,仅在该函数体内使用。 displayName()没有自己的局部变量,然而它可以访问到外部函数的变量,所以displayName()可以使用父函数init()中声明的变量name。

注意:由于闭包会携带它的函数作用域,因此会比其它函数占用更多内存。过度使用闭包可能会导致内存占用过多。

this

在全局函数中,this等于window,而当函数作为某个对象的方法调用时,this等于那个对象。不过匿名函数的执行环境具有全局性,因此其this对象通常指向window

如果在通过call()或apply()改变函数执行环境的情况下,this就会指向其它对象。

原文链接:segmentfault.com

上一篇:【Vue原理】VModel - 源码版之input详解
下一篇:tapc-amd-wrap

相关推荐

  • 🙋Hanjst汉吉斯特改进+enSafeExpression安全表达式等

    Hanjst汉吉斯特模版语言及模版引擎,近期持续改进升级。 这次改进主要是增加了对安全输出表达式兼容,由于涉及到对软件开发过程中的效率和软件运行效率的平衡和取舍,所以多写了几句,以描述这个权衡利弊对...

    1 个月前
  • 🔥0202年了,几个基础的手写函数总得会吧

    这几天看到一个大三大佬面试字节跳动的蚊子,突然觉得自己太辣鸡了···校招的题我一半多都不会啊···赶紧潜下心来学习学习提(an)高(wei)自己,边翻掘金边谷歌,简单实现了几个常用函数···(借鉴了太...

    3 个月前
  • 高阶函数的使用

    问题 字节跳动面试时问题:原函数例如fetchData是一个异步函数,尝试从服务器端获取一些信息并返回一个Promise。写一个新的函数可以自动重试一定次数,并且在使用上和原函数没有区别。

    1 年前
  • 高阶函数应用之柯里化与反柯里化

    背景 在 JavaScript 中,柯里化和反柯里化是高阶函数的一种应用,在这之前我们应该清楚什么是高阶函数,通俗的说,函数可以作为参数传递到函数中,这个作为参数的函数叫回调函数,而拥有这个参数的函数...

    6 个月前
  • 高阶函数应用 —— 柯里化与反柯里化

    在这里插入图片描述(https://img.javascriptcn.com/c94dd1ec0a5064d3cba1b5d9c7842670 "在这里插入图片描述") 前言 在 JavaScr...

    2 年前
  • 高阶函数&amp;&amp;高阶组件

    高阶函数 特点: 接受函数类型的参数。 返回值是函数。 高阶函数具有可扩展性。 常见的高阶函数: 定时器 setTimeout(); setInterval() Promise(); 数组相关:...

    4 个月前
  • 高质量的函数

    函数优化 我们上一章将了纯函数,这一章讲函数的优化 把一些强相关,定制型强的字段抽象出来,进行数据传递,里面所保存的为不相干变量。 我们也可以将函数作为参数进行传递 高阶函数 高...

    2 年前
  • 高级函数技巧-函数柯里化

    我们经常说在Javascript语言中,函数是“一等公民”,它们本质上是十分简单和过程化的。可以利用函数,进行一些简单的数据处理, 结果,或者有一些额外的功能,需要通过使用闭包来实现,最后经常会 匿名...

    1 年前
  • 高级JavaScript:为什么这个函数用圆括号封装?[重复]

    Peter Mortensennerdess(https://stackoverflow.com/users/63550/petermortensen)提出了一个问题:Advanced JavaScr...

    2 年前
  • 高程读书笔记 第六章 面向对象程序设计

    本章内容 ECMA262把对象定义为:无序属性的集合,其属性可以包含基本值、对象或者函数 理解对象 创建对象 创建自定义对象的最简单方式就是创建一个Object的实例,再为它添加属性和方...

    2 年前

官方社区

扫码加入 JavaScript 社区