资讯专栏INFORMATION COLUMN

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

boredream / 1872人阅读

摘要:函数体创建一个函数并将它赋值给变量创建的函数叫做匿名函数因为关键字后面没有标识符。可以使用命名函数表达式来达到相同的结果。不过匿名函数的执行环境具有全局性,因此其对象通常指向如果在通过或改变函数执行环境的情况下,就会指向其它对象。

函数表达式

函数表达式是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就会指向其它对象。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105196.html

相关文章

  • 如何正确学习JavaScript

    摘要:然而,虽然先生对无所不知,被誉为世界的爱因斯坦,但他的语言精粹并不适合初学者学习。即便如此,在后面我还是会建议把当做补充的学习资源。但目前为止,依然是学习编程的好帮手。周正则表达式,对象,事件,阅读权威指南第,,,章。 既然你找到这篇文章来,说明你是真心想学好JavaScript的。你没有想错,当今如果要开发现代网站或web应用(包括互联网创业),都要学会JavaScript。而面对泛...

    canger 评论0 收藏0
  • [译] 如何恰当地学习 JavaScript

    摘要:原文链接恰当地学习适合第一次编程和非的程序员持续时间到周前提无需编程经验继续下面的课程。如果你没有足够的时间在周内完成全部的章节,学习时间尽力不要超过周。你还不是一个绝地武士,必须持续使用你最新学到的知识和技能,尽可能地经常持续学习和提高。 原文链接:How to Learn JavaScript Properly 恰当地学习 JavaScript (适合第一次编程和非 JavaSc...

    Jason 评论0 收藏0
  • 《JavaScript高级程序设计》(3版)读书笔记 7 函数达式

    摘要:定义函数表达式的方式有两种函数声明。不过,这并不是匿名函数唯一的用途。可以使用命名函数表达式来达成相同的结果闭包匿名函数和闭包是两个概念,容易混淆。匿名函数的执行环境具有全局性,因此其对象通常指向通过改变函数的执行环境的情况除外。 定义函数表达式的方式有两种: 函数声明。它的重要特征就是 函数声明提升(function declaration hoisting) 即在执行代码之前会...

    邹立鹏 评论0 收藏0
  • 《JavaScript高级程序设计》(3版)读书笔记 4 变量、作用域和内存问题

    摘要:具体说就是执行流进入下列任何一个语句时,作用域链就会得到加长语句的块。如果局部环境中存在着同名的标识符,就不会使用位于父环境中的标识符访问局部变量要比访问全局变量更快,因为不用向上搜索作用域链。 基本类型和引用类型的值 ECMAscript变量包含 基本类型值和引用类型值 基本类型值值的是基本数据类型:Undefined, Null, Boolean, Number, String ...

    lidashuang 评论0 收藏0
  • 我的开源 GitBook: Python 之旅

    摘要:我在写作的过程中,给自己提了一个要求尽量深入浅出,条理清晰。至于是否达到了,希望读者们多多批评指正,并给我提意见和建议。第章介绍中的函数式编程,包括匿名函数闭包和装饰器等。第章介绍使用处理进程线程和协程。 showImg(https://segmentfault.com/img/remote/1460000007990784?w=268&h=385); 在学习和使用 Python 的过...

    赵连江 评论0 收藏0

发表评论

0条评论

boredream

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<