JS执行环境和作用域


以上是淘宝团队所译的JS高程对于执行环境和作用域的定义.

这里就是说每个函数都有一个属于自己的执行圈子,这个圈子里有抽象的对象对于我们是不可访问的对象,对象上带着当前执行环境中变量和函数的有访问权限的数据,就是所有国家的黄金都存在美国,名义上他是你的,自己国家作为一个主体,又包含了每个公民可以访问的信息,就是你的软妹币啊.这些.每个国家都是独立,不能被老美看到具体信息,国家作为一个执行环境,保护了你的信息,使其不可被外部访问,同理,并列的国家也是不能访问你的.

 这里起到作用的就是函数this的指向,每个函数在定义之初就已经确定了作用域,除非是使用apply,call,这些强行改变this的指向,这是执行环境会发生变化(毕竟,这世界还是有不少日韩这样的狗腿子的╮(╯﹏╰)╭).

1. 执行环境是基于对象的,当函数被调用的时候创建,执行环境包含了函数的声明,变量,参数等,所谓的变量提升其实就是进入执行环境后,进入了执行环境的创建阶段,扫描所有被包含的函数,变量都被赋值了一个vo值,执行环境包含的代码还未真正开始执行. 创建后所有被包含的函数,变量,参数都在一个抽象的活动对象(变量对象上,底层代码可访问),活动对象进入执行的环境栈,这是作用域链也被初始化.笼统地说,此时的执行环境就是正在被执行的代码

2. 作用域: 基于函数,比如函数内部的参数,函数外部是不能访问的(闭包改变了执行环境的this指向),这是什么原因呢,函数外部的函数已经入栈,且被定义,他没有扫描到函数内部的变量,所以在上一个执行环境中是访问不到当前执行环境的变量的.

        在一个函数中访问一个变量,如果当前的执行环境中没有,那么被包含的执行环境是有权访问包含它的父执行环境的,这样串联起来的关系,就是作用域链,即是作用域链就是用来限制拥有执行环境访问权限的变量函数访问执行环境的顺序的.

3. 当进入执行环境的第二阶段,也就是执行阶段,那么之前被扫描的变量就会被根据代码赋值,

function fn1() {

    var a = 1;

    function fn2() {

        a = 123;

    }

    fn2();

    console.log(a);// 123

}

这里就说明,根据作用域链进行访问,得到变量的使用权限,进行修改并不会改变这个变量的位置,所以在后续代码打印的时候,打印语句所在的执行环境中的变量,值已经改变了.

4. 当我们在执行某一个函数的时候,把变量值作为实参传递给函数,简单数据类型会出现复制一份,复杂数据类型会发生改变,这是为什么呢?

通俗的答案是:复杂数据类型传入函数的是它的指针,所以发生变化后,所有执行该对象的指针都发生了变化.

那么从执行环境的角度出发,这是为什么.

参数的传递是按值传入,(有种说法是两种:按值传递和引用传递),其实都是按值传入.

按值传入后,当参数传入后被调用的函数会创建新的执行环境,它的活动对象上,参数包含参数对象arguments(包含了传入的参数和callee指向函数自身),参数会被重新声明一个变量挂在当前的执行环境当中,因为所谓的引用传值,如果一致操作是指针指向的对象的值,所以给人一种是引用传值的假象,如果我们改变参数的值,就是改变了指向,就不会对父执行环境中的变量进行操作了,也就是在作用域链上失去对变量的操作权限.

    function Person() {

    }

    var obj = new Person();

    obj.name = "凌";

    function fn1(obj) {

        obj.name = "志";

        obj = {};

        obj.name = "婵"

    }

    fn1(obj);

    console.log(obj.name);// 志 

这个例子大概还是可以说明的,当指针的值,而不是存储数据值发生变化,还是可以操作对象的所以变成了志,当指针的值改变不在指向外部执行环境中变量对象的时候,就不能进行这个操作了.

写这个例子写出了忧伤的感觉,心塞

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

推荐阅读更多精彩内容

  • 执行环境:定义了变量或函数有权访问其他数,对执行环境的有权访问所有变量和函数的有序访问。 当代码在环境中执行的时候...
    一片荒凉_me阅读 306评论 1 0
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,115评论 0 13
  • 人真的不能随意立flag,因为往往下一刻就会被自己狠狠打脸。 突然间就失眠了,虽然一直睡眠都不是很好,但是最近好像...
    曲酒柒阅读 250评论 0 1
  • 最近在看一部综艺叫女人有话,我特别喜欢韩雪那一期。 三个不同性格,不认识的人在一起开始三天两夜的生活。 就像我们刚...
    橙子ee阅读 205评论 0 1
  • 第一组 第一组 第二组 第二组 第三组 第三组 第四组 第四组 第五组 第五组 第六组 第六组
    246任晶璐阅读 334评论 0 3