js运行机制


/*js运行机制题目*/
/*知识点:
1.所有的等号赋值,第一步是先创建值
函数创建的时候就声明了她的作用域

*/

/*
全局代码执行作用域EC(G)

*/
var i =0;
function A(){
    var i =10;
    function x(){
        console.log(i)
    }
    // console.log(x)
    return x   //此时返回的是函数x的函数体
}
// console.log(A()+'111')
var y=A()
console.log(y)
// y()
// var y =A();
y();
function B(){
    var i =20;
    y()
}
B()


/*一般函数执行完毕之后就出栈释放了  函数堆释放

闭包:函数执行时产生一个不被释放的私有上下文(也就是被占用的时候 ),保护里面私有变量不受污染而且还可以把这些信息保存下来,
供她的下级上下文使用 

* heap 堆函数释放:空指针  比如:
let obj ={a:'111'}
obj=null  空指针,此时obj之前指向的堆被释放

* stack 栈内存释放:
1. 全局上下文中,页面关闭即释放
2. 私有上下文中:
   (1)函数执行完,私有上下文都会出栈释放
   (2)当前上下文中的某些内容(比如一个堆),被除了当前上下文之外的内容占用了,就不能出栈.



   GC浏览器垃圾回收机制:
   (1)引用标记法_谷歌浏览器:当堆内存被占用时做标记(这个要自己查 TODO:)
   (2)引用计数_IE低版本浏览器 容易内存泄漏 TODO: 查一下内存泄漏的原因以及情况
   总结:当前内存如果被占用就不能被释放,没被占用的时候,浏览器会在空闲时间将他们释放出去





*/

/*    let  const  var  的区别

* let: 创建一个变量,这个变量可以在下面被修改 比如:
let a =10;
a =12
console.log(a)-->12

* const: 创建一个变量,关联一个值,这个值不可被修改(不能需修改此变量的关联指向) 比如:
const b =10;
b=12  --> 报错

但是,如果  const 是一个对象,可以通过成员访问的方式进行修改
比如:
const b ={
    name:'qqq'
}
b.name='aaa'
console.log(b)--> {name:'aaa'}


* 再相同的上下文中
 (1) var 允许重复声明,但只识别一次
 (2) let 不允许重复声明



*/
// console.log不会被执行,而是直接报错,是因为在词法解析阶段,如果有报错,所有代码都不会执行
//code.html:103 Uncaught SyntaxError: Identifier 'b' has already been declared
// console.log('ok')
// const b =10;
// const b =30;

/*   
var 和function 中声明的变量,除了在全局变量对象VO(G)中储存,也会在GO(window)中设置相应的属性.(新版处理机制:在全局上下文中
基于bar 和function声明的变量,会直接存储到GO也就是window中,不会在 VO(G)中存储了)


let 和const 中声明的变量,只会在全局上下文VO(G)中存储,不会在GO(window )中存储

*/

/*  js 中的暂时性死区:用typeof检测一个未声明的变量,不会报错,会显示 'undefined'
例如:  console.log(typeof n )  -->此时n未被声明,typeof n 形成暂时性死区     但是
如果   let n =10   上面输出结果就会报错:不得在未声明之前使用n   所以 
可以用 在下面let创建变量抵消上面的暂时性死区  即  let的机制可以抵消暂时性死区

*/

console.log(typeof n)
// var n =10  -->不会抵消暂时性死区
//let n=10 
 //-->Uncaught ReferenceError: Cannot access 'n' before initialization  抵消暂时性死区

{
     var k=20
    let m=90;// -->此时的m只是块级私有的 在下面无法被调用
   
    console.log(m)
}
console.log(m)


/*
匿名函数:把函数作为值赋给xxx
例如:  xxx.onclick=function(){....}

*/


/*
this 的指向

1-全局上下文中的this指向的是window
2-块级作用域指向的是他所继承的this,箭头函数也是

函数执行
 *   正常的普通函数执行:看函数执行前是否有“点”,有,“点”前面是谁this就是谁,没有“点”,this是window「严格模式下是undefined」,
 跟他在哪里调用 哪里执行的都没关系
 *   匿名函数:
 *     + 函数表达式:等同于普通函数或者事件绑定等机制
 *     + 自执行函数:this一般都是window/undefined
 *     + 回调函数:一般都是window/undefined,但是如果另外函数执行中,对回调函数的执行做了特殊处理,以自己处理的为主
 *   括号表达式:小括号中包含“多项”,这样也只取最后一项,但是this受到影响(一般是window/undefined),比如:(10,obj.fn)(),
 * 指向的是window,如果开启严格模式,会显示undefind
 * function fn() {
//     console.log(this);
// }
// let obj = {
//     name: 'zhufeng',
//     fn
//     // fn: fn
// };
// fn(); //this->window/undefined
// obj.fn(); //this->obj
自执行函数的this是window 或者undefeated(在严格模式下
自执行函数举例:
(function(){
    console.log(this)==>输出window
})(10)


回调函数:把一个函数A作为实参,传递给另外一个执行的函数B「在B函数执行中,可以把A执行」
/* function fn(callback) {
    // callback -> 匿名函数
    callback();
}
fn(function () {
    console.log(this);
}); */

/* let arr = [10, 20, 30];
// arr.forEach(function (item, index) {
//     console.log(this); //->window
// });
arr.forEach(function (item, index) {
    console.log(this); //->forEach第二个参数「对象」  forEach内部做处理了
},{xxx:'xxx'}); 


数组的foreach方法,传的第二个参数会改变this的指向
*/
//一道题来了!!
var x = 3,
    obj = {
        x: 5
    };  
    /**在全局上下文中创建了变量
     * x-------3
     * 对象obj-------指向堆地址 0x001
     * 作用域
    **/
obj.fn = (function () {
    this.x *= ++x;
    return function (y) {
        this.x *= (++x) + y;
        console.log(x);
    }
})();

/*
自执行函数,在创建的时候会自己调用一次,指向堆地址0x002  
作用域:全局 EC(G)

内容:
'this.x *= ++x;
    return function (y) {
        this.x *= (++x) + y;
        console.log(x);'

执行: this.x=this.x*(++x),前面的this.x,是window.x,也就是3,后面的x也是全局的x,也是3  所以
此时里面的x都是3 全局x经过运算之后
this.x=this.x*(++x)
      =3*4
      =12
      

执行完毕,返回一个匿名函数,存储在0x003 同时在0x001堆内存中创建 fn-------0x003,被占用,形成不被释放的闭包
注意:自执行函数,创建时自调用一次之后,返回的值 赋给等号前面的东西
此时:
全局变量中:
x-----3 变为 x------4(因为++x),再变为x-----12

0x003的内容:
'this.x *= (++x) + y;
        console.log(x)'
        形成作用域EC(003)

执行完毕后,没有被占用,释放0x002内存

此时0x001中的变量
x-------5
fn------0x003

*/
var fn = obj.fn;

/*在全局中创建一个变量fn-------0x003

此时全局变量中存在的有:
x-------------12
obj--------0x001
fn------------0x003
*/
obj.fn(6);
/*
执行0x003中的代码段
this.x *= (++x) + y;
        console.log(x)
形成私有上下文,私有作用域EC(1),私有变量
y--------传参6
this的指向为obj,根据点语法,obj.fn调用,this就是obj
this.x=this.x*((++x)+y)
      =5*((全局x--12自增=13)+6)
      =5*(13+6)
      =95
      此时obj中的x发生改变
obj中:
x-----5 变为x----95

全局变量中
x----12 因为自增,变成了x----13



*/
fn(4);
/*
函数调用:相当于0x003中传参4
因为没有被点,所以匿名函数的this 没有严格模式下为window
此时:
this.x *= (++x) + y;
        console.log(x)
this.x是window中的x,为13,++x的x 也是全局的x 为13,y是此匿名函数执行时形成的新的私有上下文EC(2)中的私有变量
y------4
所以执行函数:
this.x=this.x*((++x)+y)
      =13*((x--13自增为14)+4)
      =13*18
      =234
----也就是 此时全局的x变成了234
因为没被占用,执行完毕后释放
*/

console.log(obj.x, x,);
/*最终这道题的答案是:
obj.x为95
x为234
*/




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

推荐阅读更多精彩内容