JavaScript散乱(四、细节)

js高级

案例问题

案例一:
let a={name:"测试"};
function test(obj){
    obj={name:"hehe"};
}
test(a);
console.log(a);//{name: "测试"}
说明:a传入test中,obj重新赋值,obj的的形参的指向就变化了,此时其实obj={name:"hehe"};在函数执行完毕就会被当作垃圾回收,而a的指向是不变的。
案例二:
let a={name:"测试"};
function test(obj){
    obj.name="qiang";
}
test(a);
console.log(a);//{name: "qiang"}
说明:该案例对比案例一,该案例,obj持有的也是a同样的
地址索引,所以,改变obj的name就是修改a的name属性。
案例:原型
 function F(){

}
Object.prototype.a=function(){
    console.log("a()")
}
Function.prototype.b=function(){
    console.log("b()")
}
var f=new F()
f.a() //a()
f.b()   //报错
F.a() //a()
F.b() //b()
说明:Function也是一个对象,派生于Object对象。
f是对象,不属于Function类型,所以f.b()在F中找没有,然后去Object中找也没有。
F.a()执行:F本身没有a方法,去它的原型找,原型是Function(也是一个对象,通过其__proto__可知最后到了Object上面),原型上还没有a方法只有b方法,继续去Function的原型上找,所以找到了Object上面。

作用域和作用域链

全局作用域也就是window和函数作用域,不考虑es6的块级作用域前提下,作用域个数=函数定义个数+1.
作用域链就是内部作用域找不到去外级作用域找,最后到全局作用域。

案例一:
var a=100;
function test(){
    var a=200;
    function test1(){
        console.log(a)//200
    }
    test1();
}
test()
案例二:
var fn=function(){
    console.log(fn)
}
fn()//ƒ (){console.log(fn)}
var obj={
    fn2:function(){
        console.log(this.fn2)//ƒ (){console.log(fn)}
        console.log(fn2)// fn2 is not defined
    }
}
obj.fn2()
说明:对比案例一发现,理论上console.log(fn2)应该是可以找到的,但是实际上,obj内部不是作用域,所以fn2
函数内部找不到fn2之后,直接去上一级作用域也就是此时的window找也没有。而案例一test是函数,其也是作用域

内存溢出和泄露

  • 内存溢出:程序运行需要的内存超过了剩下的内存时,就会抛出内存溢出的错误
  • 内存泄露:占用内存没有用但是又没有即时释放

例如:意外的全局变量,没有即时清理的定时器或回调函数,闭包

闭包

内部函数持有外部函数的引用

function test(){
    let a=10;
    function test1(){
        console.log(a);
    }
    let t1=function(){
        console.log(a);
    }////////////
    return test1;
}
let t=test();
t();
t=null;
说明:两个内部函数的定义是有区别的,因为函数声明提示,test1在test函数内部第一行就声明和定义一起完成,
t1声明是在第一行但是定义是在其执行完毕才定义(也就“/////”所在的一行).
注意因为t的引用问题,所以test函数执行完毕也不会释放
test函数本身和闭包的相关引用,所以可能造成内存泄漏,
所以如果确定闭包不使用了,可以把对象值设置为null。
闭包案例一:
var name="The WIndow";
var obj={
    name:"obj",
    getName:function(){
        return function(){
            return this.name;
        }
    }
}
console.log(obj.getName()())//The WIndow
说明:因为obj调用所以getName内部的this就是obj,但是
执行完毕返回的是一个函数然后在执行,相当于就是在window直接执行了该方法,所以内部匿名函数的this就是window。
闭包案例二:
var name="The WIndow";
var obj={
    name:"obj",
    getName:function(){
        return ()=>{
            return this.name;
        }
    }
}
console.log(obj.getName()())//obj
说明:obj的getName函数没有用箭头函数。其内部this还是obj,但是内部匿名函数是箭头函数,指向调用者,此时指向obj所以输出obj。
闭包案例三:
var name="The WIndow";
var obj={
    name:"obj",
    getName:()=>{
        return ()=>{
            return this.name;
        }
    }
}
console.log(obj.getName()())//The WIndow
说明:都是用箭头函数,则指向相当于为最终调用者,即window
闭包案例四:
var name="The WIndow";
var obj={
    name:"obj",
    getName:function(){
        var that=this;
        return function(){
            return that.name;
        }
    }
}
console.log(obj.getName()())//obj
说明:that已经指向getName函数作用域,也就是obj

浏览器内部流程

浏览器一般都是多线程的,但是js是单线程执行的,下图是说明

QQ截图20180608152428.png

初始化代码都是在主线程执行,且必须初始化代码执行完毕才能执行其他代码

setTimeout(()=>{
    console.log("执行")
},0);
for(var a=0;a<10000000000;a++){}
说明:setTimeut是初始化代码,但是内部的回调函数不是初始化代码,所以即使时间是0也会在初始化代码执行完毕之后才执行

事件循环模型

eventloop会每次从callback队列中每次取出一个执行,但是是分线程,所以主线程如果耗时,则回调队列
内部也不会顺利的立刻执行。

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

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,373评论 8 265
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,148评论 0 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,097评论 1 32
  • 每只毛毛虫都可以变成自己的蝴蝶。只不过,在变成蝴蝶之前,自己会先变成作茧自缚的蛹。在茧里边面对自己制造的痛苦,任何...
    笨小猫Jolin阅读 140评论 0 0
  • 有时候我会懊恼自己的退缩,我总害怕别人会拿鄙视的眼光看我,总是觉得如果凡事冲到前面会让人感到讨厌。 有时候我会冲动...
    人生只若初见kl阅读 186评论 0 0