函数总结

  • 函数的基础和注意点

1. return       
2. 调用自身形成递归
3. 无重载
4. **参数传递**方式
5. **arguments对象** 
    arguments不是真正的数组,对象除了可以读取参数,还可以为参数赋值(严格模式不允许这种用法)。
    有length 和callee属性;
    之前用arguments的地方可以被es6的解构和==rest==给取代了
  • 函数作用域

    1.变量的作用域
    2 .函数本身的作用域

>函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,就是其声明时所在的作用域,与其运行时所在的作用域无关。
>所以才需要参数啊,数值都基于参数;

3.==闭包==  :内部函数可以读取外部函数的局部变量,把此内部函数返回,就可以在外部读取其内部变量。

**闭包作用**: 读取函数内部的变量,一直保持在内存中,二是 使得其诞生环境一直存在;

原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制回收。

1
2
3
4
5
6
7
8
9
10
11
function f1(num){
console.log(num)
return function f2 (){
console.log(num++)
}
}
var out=add(3)
out()// 3,3
out()//4
另一个for循环的
1
2
3
4
5
6
7
8
9
  for (var i = 0; i < 10; i++) {
       (function(a) {
           // 变量 i 的值在传递到这个作用域时被复制给了 a,
           // 因此这个值就不会随外部变量而变化了
           setTimeout(function() {
               console.log(a);
           }, 1000);
       })(i); // 我们在这里传入参数来"闭包"变量
   }
  • 立即调用的函数表达式(IIFE)

    1.写法
    2.目的:一是不必为函数命名,避免了污染全局变量;二是IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。
    3.es6的 ==作用域{}== 可以取代这种写法了;

参考blog

热评文章