js函数详解
#====== 函数=====
├── 概述
│ ├── 函数的声明
│ ├── 函数的重复声明
│ ├── 圆括号运算符,return语句和递归
│ ├── 第一等公民
│ ├── 函数名的提升
├── 函数的属性和方法
│ ├── name属性
│ ├── length属性
│ ├── toString()
├── 函数的作用域
│ ├── 定义
│ ├── 函数内部的变量提升
│ └──函数本身的作用域
#===============
##概述
- 函数的声明
- function命令, function命令声明的代码区块就是一个函数
1 ``` 2 function print(param) { 3 console.log(param); 4 } 5 ```
- 函数表达式,将一个匿名函数赋值给一个变量,这种方式function后面没有函数名
1 ``` 2 var print = function(param){ } 3 ```
- function构造函数,function接收的所有参数中,最后一个是函数体,如果只有一个参数,那么这个参数就是函数体。
1 ``` 2 var foo = new function( 3 'x', 4 'y', 5 'return x+y' 6 ) 7 ```
- 重复声明
- 一个函数被多次声明,后面的就会覆盖前面的,前一次声明在任何时候都是无效的。
- 圆括号运算符,return语句和递归
- 在函数名后加圆括号会调用函数时,圆括号可以传入参数
- return表示返回,如果return语句后还有其他语句也不执行了
- 函数可以调用自身,称之为递归
- 第一等公民
- js将函数看做一种值,与其他值(数值,字符串,布尔值等等)地位相同。凡是可以使用值得地方,就能使用函数。函数只是一个可
以执行的值
- 函数名提升
- js将函数名视为变量名,用function声明函数时,整个函数也会想变量声明一样,被提到代码头部
##函数的属性和方法
- name属性
- 函数的name返回函数的名字。
1 ``` 2 var foo = function() {}; 3 function foo2() {}; 4 var foo3 = functon print(){}; 5 foo.name // foo 6 foo2.name //foo2 7 foo3.name //print 8 ```
- length属性
- length属性返回函数预期传入的参数个数
1 ``` 2 function print(a,b) {}; 3 print.length //2 4 ```
- toString()
- func.toString()会返回一个字符串是这个函数的源码
- 对于原生函数返回的内容是 function(){[native code]}
#函数的作用域
- 定义
- 对于顶层函数来讲,函数外部声明的变量就是 全局变量 ,它可以在函数内部读取
- 函数内部定义的变量,函数外部无法读取,称为 局部变量 ,它在函数内部可以覆盖同名全局变量
- 函数内部变量的提升
- 与全局作用域一样,函数作用域内部也会产生变量提升作用,var声明的变量不管在任何位置都会被提至函数头部
1 ``` 2 var a = 1; 3 var x = function () { 4 console.log(a); 5 }; 6 7 function f() { 8 var a = 2; 9 x(); 10 } 11 12 f() // 1 函数x是在f外层声明的,所以它的作用域绑定外层,它无法获取到f内部变量a的value 13 ```
1 ``` 2 function foo() { 3 var x = 1; 4 function bar() { 5 console.log(x); 6 } 7 return bar; 8 } 9 10 var x = 2; 11 var f = foo(); 12 f() // 1 bar绑定的作用域是foo,所以它接收的变量是foo了里面的 13 ```