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

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弹出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容