美文网首页前端杂货铺Web前端之路
9.js基础--函数重要概念

9.js基础--函数重要概念

作者: 梦见君笑 | 来源:发表于2017-03-16 15:36 被阅读24次

1.匿名函数

定义函数时,不使用任何变量引用的函数;

1.为何使用:使用匿名函数,可以节省内存空间,使用完毕以后立刻释放。

2.何时使用:如果一个函数只使用一次

3.如何使用: 

   1>自调:   创建完函数立刻执行

(function (){console.log("aaa")})()        // aaa


(function(date){console.log(date.toGMTString())})(new Date()) 
                                                                  //Wed, 15 Mar 2017 07:13:44 GMT

   2>回调:   将函数传给另一个函数使用

arr.sort(function(a,b){return a-b}); 



2.函数重载

js中实际上不存在重载的概念,因为js中不支持同时包含多个同名函数,最后定义的同名函数会覆盖之前定义的。但一个函数可以通过不同的参数列表(类数组对象arguments)来实现各个功能,我们称之为函数重载。

传统方式1;

var overrideMethods = function(){
    switch (arguments.length){
        case 0 :
                console.log("class no body");
                break;
        case 1:
                console.log("class has one body");
                break;
        case 2:
                console.log("class has two body");
                break;
        }
}
overrideMethods();  //class no body
overrideMethods("wu");  //class one body
overrideMethods("wu","li");  //class two body


3垃圾回收

清除不再使用的对象,释放存储空间。

垃圾回收进程器:是一个专门负责释放不再使用的对象的小程序。js引擎自带,自动执行,后台程序。

垃圾回收的原理:(对象的生命周期)

1.创建一个对象时,垃圾回收器会标记该对象的引用计数器为1;

2.使用对象的过程中,只要多一个变量引用该对象,计数器就+1;

3.主动为一个变量赋值为null时,就释放了该变量对对象的引用。计数器就-1;

4.如果一个对象不在被任何变量引用,计数器就变为0.垃圾回收就释放对象。

在使用完一个较大的对象后,都要主动用null释放对该对象的引用。


4.函数的生命周期

1.当程序开始执行时:创建一个 Execution  Context Stack(ECS 执行环境栈),创建全局作用域对象 ,在ECS中压入第一个全局执行环境EC,全局EC引用window;


2.当定义函数时:(就是定义函数对象,封装函数定义)在函数对象中,设置scope属性,引用函数来自的作用域,通常scope都是window


3.创建一个活动的对象Actived Object(AO),向ECS中压入本次函数调用的执行环境EC,EC的scope chain引用AO。


4.当函数调用结束后,EC出栈,导致AO无EC引用,被释放。

1.ECS(执行环境栈):保存正在调用的函数的执行环境的栈结构

2.AO(活动对象):保存函数的局部变量的函数作用域对象。

结论:

1.单线程
2.同步执行,只有栈顶的上下文处于执行中,其他的上下文需要等待
3.全局上下文只有唯一的一个,他在浏览器关闭的时候出栈
4.执行上下文的个数没有限制
5.每次某个函数被调用,就会有新的执行上下文为其创建,即使调用的自身函数,也是如此。

5.作用域和作用域链

作用域:一个变量的使用范围

window是全局作用域,AO对象是函数作用域,AO对象引用着window对象

作用域链:由各级作用域对象,逐级引用形成的链式结构,就是作用域链,作用域链的末尾是window对象。

作用域链控制着变量的使用顺序:

1.优先使用AO中的局部变量;

2.如果AO中没有,就延作用域链向下找

3.如果到window对象仍然没找到,就报错。


6.闭包

重用变量,保护变量不受污染的机制。

如何使用:

1.用外层函数将受保护的变量和操作变量的函数封装在内部。

2.外层函数将内层函数返回

3.调用外层函数,获得返回的内层函数对象。

function f1(){
    var n = 999;
    function f2(){
        alert(n);      //内层函数操作受保护的变量
    }
    return f2;
}
var result = f1();     //result  为  f2()
result();   //999

函数执行时,首先创建一个ECS,全局作用域入栈,遇到可执行代码   var result = f1();
f1()的EC入栈,执行结束以后 return f2;并赋值给result,此时变量result 指向f2();f1()执行结束出栈,继续执行代码,result()的EC入栈,执行代码,结束后出栈。

注意:函数中,遇到return 能直接终止可执行代码的执行,因此会直接将当前EC弹出。

相关文章

  • 9.js基础--函数重要概念

    1.匿名函数 定义函数时,不使用任何变量引用的函数; 1.为何使用:使用匿名函数,可以节省内存空间,使用完毕以后立...

  • 零基础认识DAX: 语法、函数、上下文

    DAX中三个非常重要的基础概念:“语法”、“函数”和“上下文”。当然,DAX 中还有其他重要概念,但了解这三个概念...

  • Swift语言中函数

    swift语言中函数是一个重要的概念,今天主要谈论下函数的相关知识: 函数基础: 先看一段代码: func pri...

  • 函数式编程与RxJava(附demo)

    函数式编程 在开篇我需要介绍一下什么叫函数式编程,我先引用网上的一个概念: 函数编程语言最重要的基础是 λ 演算(...

  • Java 函数式接口说明

    整理一下 Java8 之后的重要概念 函数式接口的说明和团队分享,这是函数式编程和 Lambda 表达式的基础。虽...

  • 考研数学不定积分考点总结

    不定积分是一元函数积分学的重要组成部分,是计算定积分的基础。不定积分的基本概念是原函数概念,重点在于不定积分的计算...

  • 深入理解函数式编程之functor

    在函数式编程中,函子(functor)可以说是一个很基础的概念。当然了,还有一个更基础的概念是函数(functio...

  • 数学基础2:导数

    导数概念 导数(Derivative)是微积分中的重要基础概念。当函数y=f(x)的自变量x在一点x0上产生一个增...

  • 多元函数的极限

    多元函数的极限是多元函数微分学中非常重要的一个基础概念。本篇文章是我在微积分的学习中为了巩固多元函数极限的知识而记...

  • 函数回顾

    1.函数 写代码的方式:面向过程-->函数式编程(多)-->面向对象编程 1.1 函数基础概念 函数基本结构def...

网友评论

    本文标题:9.js基础--函数重要概念

    本文链接:https://www.haomeiwen.com/subject/iailnttx.html