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 ```

 

posted @ 2019-04-23 09:36  大白驴🤣  阅读(127)  评论(0编辑  收藏  举报