JavaScript函数总结

目录

  1. 函数是如何定义的?
  2. 函数是怎样调用的?
  3. 函数的参数都有哪些性质?
  4. 函数有哪些性质?
  5. 闭包

函数的定义

  • 函数声明:使用function关键字来声明,后面跟一组参数以及一个函数体

            function functionName(arg0, arg1,...argN) {
                statements;
            }
            

    functionName为标识符,函数体写在花括号内,以分号结束

  • 函数表达式:创建一个函数并将它赋值给变量

            var functionName = function(arg0, arg1, ...garn) {
            statements;
            }
            
    • functionName可选(作为参数传递给其他函数)
    • functionName在递归函数时很有用
  • 两者的差异

    • 函数声明不能出现在循环、条件判断或者try/finall以及with语句中(FF允许在if语句中出现条件函数声明)
    • 函数声明“被提前到外部脚步或者外部函数作用域的顶层(可以在定义之前调用)”

函数的调用

  • 作为函数

    • 由一个函数对象和左圆括号,参数列表,右圆括号,其中参数列表由逗号分隔的0个或者多个参数表达式组成
    • 以函数形式调用的函数通常不使用this关键字因为:

      • 在ECMAScript3和非严格模式时对函数的调用规定调用上下文为全局对象
      • 严格模式为undefined
  • 作为方法

    • 函数体this引用该对象
    • 大多数方法调用点号来访问属性(也可以用方括号来防问,但是不推荐)
    • this在嵌套函数中作为方法调用,this指向调用它的对象,
    • this作为函数调用,返回全局对象或者undefined,解决办法是将this保存在一个变量里面
  • 作为构造函数

    • 构造函数调用创建一个新的空对象,继承自构造prototype的属性
    • 可以使用this关键字来引用
    • 构造函数通常不使用return关键字
  • 通过call()和apply()方法间接调用

    • 允许显式指定它调用所需要的this值
    • call()--自有的实参列表
    • apply()以数组形式传入参数

函数的参数

  • 函数的参数分为形参(可选)和实参
  • JS中参数内部是用类数组来表示的,函数接收到的始终是这个类数组(arguments)。
  • arguments的值永远与对应的命名参数的值保持同步,而且影响是单向的,修改命名参数不会改变arguments中对应的值
  • 参数传递的是值,不能通过引用传递参数

函数的性质

  • 作为值的函数

    • 将函数赋值给变量,存贮在对象的属性或数组的元素中,作为参数传递给别的函数
    • 函数是对象,可以拥有属性
  • 作为命名空间的函数(在写模块时很有用)

    • 将代码放入一个函数体内,然后调用
    • 匿名函数

闭包

  • 几个基本概念

    • 函数的执行依赖于变量作用域,这是作用域在函数定义时决定
    • 变量作用域:源代码中定义这个变量的区域
    • 函数变量可被隐藏在作用域中,看起来是函数将变量“包裹”起来
    • 调用函数时闭包所指向的作用域和定义函数时的作用域不是在同一个作用域链,嵌套函数的作用域链延长在外部作用域上
    • 作用域链:
      • 用途: 保证对执行环境有权访问的所有变量和函数有序访问(由内向外,直到找到为止)
      • 顺序: arguments对象-->包含环境-->下一个包含环境-->全局执行环境-->全局执行环境的变量对象
      • 性质: 每次调用外部函数时,作用域链都不同
  • 闭包的用途

    • 模仿块级作用域

      • 立即调用,不会在内部中留下对该对象的引用
      • 立即销毁(例外,赋值给了包含的作用域)
    • 创建私有变量

        特权方法

      • 构造函数定义特权方法--针对每个实例会创建同样一组新方法
      • 静态私有变量--影响查找速度

你可能感兴趣的:(js函数)