JavaScript 函数
2017-6-24
| 2023-7-17
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
| 函数声明 | 函数表达式 | 函数构造器 ---|---|---|---| 前置 | 是 | | 允许匿名 | | 是 | 是 可立即调用 | | 是 | 是 在定义该函数的作用域通过函数名访问 | 是 | | 没有函数名 | | | 是

JavaScript 特点

函数

  • js函数的参数并不会验证传递进来多少个参数, 也不会在乎传进来的参数是什么数据类型, 在函数体内可以用arguments对象来访问这个参数数组.
  • arguments对象中的值会与命名参数的值同步修改, 即修改arguments值时会同步修改参数的值, 反之亦然.
  • js中函数没有重载
  • Js中每个函数都是Function类型的实例,因而与其他引用类型一样具有属性和方法。
  • 函数内部有两个特殊对象arguments和this
    • arguments.callee 指向拥有这个arguments对象的函数。可用于消除与函数名的紧耦合
    • arguments.caller 保存着调用当前函数的函数的引用
    • this 对象引用的是函数据以执行的环境对象
  • 函数中包含两个属性length和prototype
    • length 表示函数希望接收的命名参数个数
    • prototype 保存函数所有实例方法的真正所在,例如toString()和valueOf()等
  • 每个函数包含的方法:apply()call()bind()

JavaScript 的变量和作用域

  • 基本类型的复制是完全独立的复制值复制, 引用类型的复制实际上是复制的一份指针.
  • js中所有函数的参数都是按值传递, 基本类型传递如同基本类型变量复制一样, 引用类型传递如同引用变量复制一样.
  • try-catch语句的catch快和with语句会延长作用域链
  • js中没有块级作用域, for/if花括号中定义的变量在花括号外也可访问.

引用变量

  • Js中面向对象未实现面向对象的类和接口等基本结构,一般称为引用类型或对象定义。
  • 访问对象的属性除了通用的.,还可使用[],从而通过变量来访问对象属性。
  • 为了便于操作基本类型值,Js提供了基本类型的自动包装功能,每单读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,并在调用后自动销毁。
  • 由于基本包装类型和基本类型的含义并不一样,会导致typeof等操作产生不同的结果,不推荐显示实例化基本数据类型

函数的调用

  • 直接调用 foo();
  • 对象方法 o.method();
  • 构造器 new Function();
  • call/apply/bind func.call(o);

函数声明和表达式

函数声明会被前置,函数表达式变量声明会被前置,但是值为undefined

函数声明

函数表达式

  • 将函数赋值给一个变量
  • 匿名函数(IEF 立即执行函数表达式)
  • 返回函数对象
  • 命名函数表达式(NEF)
命名函数表达式存在一些经典的bug,例如在执行如下代码时:
IE6会提示为false,IE9+中nfe外部并不可见,提示为nfe is undefined
命名函数表达式主要可以应用在调试和递归调用时。
但也可直接通过func变量名来执行递归调用,因此命名函数表达式并不常用。

function构造器

function构造器的作用域

各方式对比

函数声明
函数表达式
函数构造器
前置
允许匿名
可立即调用
在定义该函数的作用域通过函数名访问
没有函数名

this

全局的this

全局的this一般即是浏览器

一般函数的this

一般函数的this仍然指向全局对象,浏览器中即为window
严格模式下,this指向undefined

作为对象方法的函数this

对象方法中的函数this会指向具体的对象
也可以通过外部定义函数

通过callapply调用指定this

一般模式和严格模式下使用apply的区别

'bind'方法与this

通过ES5提供的bind方法,可以将函数的this绑定到一个对象上,bind之后this不可变。

函数属性和对象

使用bind()方法currying函数
bind和new的使用
JavaScript
Java IO学习要点导图JavaScript闭包基本概念
目录