作用域

本篇内容是基于你不知道的javaScript上卷以及自认为是重点的内容,比较基础,如有不对。欢迎各位大佬指正

关于javaScript的历史我这里就略过了,有兴趣的小伙伴可以去你不知道的javaScript上卷书籍或者pdf或度娘自行观看

ok,进入主题

1=> 作用域

几乎所以的编辑语言最基本的功能之一 —可储存变量持有的值,并且可对值进行访问或修改

(储存,访问,修改等,这种能力,你可以理解为状态 ,状态让程序可突破和扩展,否则,只能做一些简单的任务),

但是,这些变量住在哪里,值在哪里?它们储存在哪里,重点是,怎么找到它们?这些问题说明需要一套设计良好的规则来存储变量。并且之后可以方便的找到这些变量,这套规则被称为作用域

那么问题A是:

            这些变量住在哪里,值在哪里?它们储存在哪里,重点是,怎么找到它们?

            (内存图) 


答:上图基本的回答了问题A抛出的问题。至于引用指向,值类型等问题。后面会另开文章解答,否则会跑偏本题(作用域),内存中的栈堆池也是分大小的哦。

ok,问题A解决,虽然和作用域没什么关系,但至少我知道问题A的答案a!!

这里需要讲到 =》JS的解析过程

编译:预处理,在这一过程中,JS解释器完成对JS代码的预处理,(词法分析、语法分析)

运行:JS是一种解释型语言,所谓解释型是指代码在执行时被解释器一行一行动态编译和执行,而不是执行前完成编译,即边编译边执行,

执行期:JS引擎按着作用域机制来执行,JS的变量和函数作用域是在定义时决定的,而不是执行时才决定的,所以JS解释器只需要通过静态分析就能确定每个变量和函数的作用域,这种作用域称为静态作用域,如执行时才决定的,这种叫做动态作用域

(如不理解JS解释器是什么的同学,送你们- JavaScript运行环境,宿主环境,

链接:https://www.cnblogs.com/sniper007/archive/2011/10/27/2226270.html

链接:http://blog.csdn.net/chenxianru1/article/details/78470101?locationNum=1&fps=1

)

当然了。js的解析过程其实不单单只有这些的,例如性能的优化等,这里只是指出大纲,复合本篇的部分内容

问题B:为什么要讲到解析过程?

答:因为编译时,词法分析中会延伸出词法作用域

2=> 词法作用域 (助你理解闭包和声明提升)

①:故名思意,词法作用域就是定义在词法阶段的作用域,换句话说,就是你在写代码时。把变量或函数或语句块写在哪里来决定的,保存作用域不变(大部分情况是这样。也有欺骗词法作用域的方法,但不再本讲解内。也不建议去了解)(闭包就是基于词法作用域书写代码时所产生的自然结果)

②无论函数在哪里被调用。如何被调用,它的词法作用域都只由函数被声明时所处的位置决定 (闭包的本质=词法作用域和函数当作值传递。)

分析3步

        第一步:先分析参数

        第二步:再分析变量声明

        第三步:分析函数声明

    具体步骤

        0:  函数(变量)在运行的瞬间,会生成个空的 Active Object (活动对象,注意,是个对象)。下简称AO

        1:  函数接收形参参数,添加到AO的属性,并且这个时候值为undefine,即AO.age=undefine

        1.2:接收实参,添加到AO的属性,覆盖之前的undefine 即AO.age=18

        2:  分析变量声明(注意这里。是声明)。如var age;; (若没有变量var age该声明。跳过。找到函数var age该声明)

                如果中AO还没有age属性,则添加AO属性为undefine,即AO.age=undefine

                如果AO上面已经有age属性了,则不作任何修改 还是var age=18

        3:  分析函数声明

                如果有function age(){}把函数赋给AO.age ,覆盖上一步分析的值 既AO.age=function age(){}

function func(age) {

        console.log(age); 函数 function age()  声明提前,函数优先度大于变量

        var age = 25;

        console.log(age); //25

        function age() {}

        console.log(age); //25

    }

    func(18);

记住以上。词法作用域也就没什么神秘

3=>  函数作用域

全局作用域和局部作用域

简单来说。window下,函数A内附属有变量b或函数c,则为局部作用域,函数A之外的,则为全局作用域。对于变量的查找。都是由内向外的,这个比较简单,就不做过多讲解

4=>  块级作用域

对于部分新接触javaScript的朋友来说。他们似乎看到if/switch/while/for/do等。这些含有{}的关键字,例if(){}else{}.for(){},,觉得,咦。这一块一块的。就是块级作用域的。没毛病啊

比较遗憾。在es6之前。javaScript是没有块级作用域的。以上的那些关键字。其实是语句,语句块,例如:条件语句(if/switch),循环语句(while/for/do),强制跳转语句(break/return/throw)等。es6的let关键字,有兴趣的可以去了解下

5=> 作用域嵌套

emmmmm,这个嘛,函数A里面写个函数B。这就是嵌套了,查找也是由内向外的

6=> 声明提升(也叫声明提前,一个意思)

先有鸡?先有蛋?猜对了给你金坷垃

看完前面的一些概念,应该对作用域比较了解了把,简单一句总结:任何声明在某个作用域内的变量,都将附属于这个作用域

例:var a=2;

词法分析再度来袭!

在前面词法作用域说过了。这里我们看,觉得就是一句var a=2,然而,在JS解释器来看,是两个完全不同的,单独的声明

var a=undefined =》词法分析期

a=2 =》执行期,赋值操作

换个例子。

a=2;

var a;

在词法分析期,var a声明会被提升到该作用域的最顶层,赋值或者其他运行逻辑会留在原地

问题来了。如果我写的函数和变量同名,那么谁是最顶层呢?嘿嘿,看看前面的词法作用域例子就知道了

说到声明提升,或许要说说函数和函数表达式的区别:

foo()

function foo(){}=》这个为函数声明 没毛病 也可以执行

foo()

var foo=function bar(){} =》这就是表达式, 变量foo持有函数bar,在声明提示中var foo=undefined,undefined无法调用啊,所以,会报错

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

推荐阅读更多精彩内容