词法分析/作用域

1.js变量的查找

js中函数嵌套是十分普遍的
对变量是如何寻找的?------->从内部向外部寻找
首先在函数内寻找
找不到就在外层找
直到全局(window)区域

源码例子

var c=5;
function t1(){
    var d=6;
    function t2(){
        var e=7;
        //var d=3; 去掉注释观察结果的变化
        alert(c+d+e);
    }
    t2();
}

t1();//分别得到15,18

2.声明变量var的作用


alert(window.d);//undefine
alert(window.e);//undefine
function t(){
    d=5;
    var e=6;
}
t();

alert(window.d);//5  没有加var就是仅仅是赋值操作,寻找t域内的函数,没有找到,继续寻找。。。。>window-->window.d=5
alert(window.e);//undefine


//var 是在函数运行的上下文中,申明一个变量 如果不加var,则是一个赋值操作,不要狭隘理解为创造了一个全局变量
function t1(){
    var d;
    function t2(){
        d=5;
        e=6;
    }
    t2();
}
t1();
console.log(d);//d is not defined错误  
console.log(e);//6
console.log(window.d);//undefine

//注意:以window.xxx引用全局变量,寻找不到作为某个属性不存在,返回 undefined 直接以xxx引用某变量寻找不到则是报 xxx is not define 错误

例题

var str1='global';
function t1(){
    console.log(str1);//返回global
    console.log(str2);//报str2 is not defined
    str2='local';//做了window.str2='local'这样一个操作
}
t1();
//在t1寻找str1---没有,在window上寻找str1---有  打印global
//在t1寻找str2---没有,在window上寻找str2---没有,报str2 is not defined
//(实际上出错还没有执行到这一些)才把全局的str2的变量赋值上去
var str1='global';
function t1(){
    console.log(str1);//返回global
    console.log(str2);//返回undefined
    var str2='local';
}
t1();

js代码自上而下执行
但是js代码在整体运行分为 词法分析期 ,运行期
自上而下执行之前,先有个词法分析过程
------------------------------------------------例如---------------------------------------------------------------
第一步:先分析t1函数
分析出t1内有str2局部变量,注意此时代码未运行str2未赋值,所以str2的值是undefined
第二步:执行t1函数
console.log(str1);//返回global
console.log(str2);//返回undefined
str2='local'//此时str2的值为local

3.词法分析

词法分析
第一步:分析参数
第二部:分析变量声明
第三步:分析函数声明

一个函数能使用的全局变量,就是按照上面的三个步骤分析而来的

具体步骤:
0:函数运行前的瞬间,生成active object(活动对象),下面简称为ao
1:函数声明的参数形成ao的属性,参数的值就是属性的值,接收实参,形成ao相应属性的值
2:分析变量的声明
如果ao没有有age属性则添加为ao属性,值全是undefined
如果ao上已经有age属性,则不做任何影响
3:分析函数申明,如function foo(){}
把函数赋给ao.foo属性
注:如果此时foo属性已经存在,则被无情覆盖
实例1

function t(age){
    alert(age);
}
t(5);//5
t();//undefined

/*
词法分析过程
ao{age:undefined}
运行过程:
t(5)-->ao.age=5;alert(ao.age);//5

t()--->ao.age没有得到赋值还是undefined
*/

实例2

function t2(age){
    var age=99;
    alert(age);
}
t2(5);
/*
分析过程:
0:形成ao={}
1:分析形参ao={age:undefined}
   接收形参ao={age:5}
2:分析var age,发现ao已经有age属性,不做任何影响

执行过程:
ao.age=99;
alert(age);
*/

实例3

function t3(greet){
    var greet='hello';//试着变成var greet试一下
    alert(greet);
    function greet(){

    }
    alert(greet);
}
t3(null);//hello    hello
/*
词法分析过程:
0:ao={}
1:分析参数ao={greet:undefined}
   接收形参ao={greet:null}
2:分析greet变量声明,ao已经有greet 属性,因此不做任何影响
3:分析greet函数声明,ao.greet=function(){},被覆盖为函数

执行过程:
greet='hello';
alert(greet);//---------->hello
alert(greet);//---------->hello
*/

实例4

function a(b){
    alert(b);
    function b(){
        alert(b);
    }
    b();
}
a(1);
/*
分析:

0:ao={}
1:分析参数ao= {b:undefined}
  接收参数ao={b:1}
2:分析var 声明,此函数没有var
3:分析函数声明,ao={b:function{alert(b);}}

执行:
alert(b);

*/

实例6

function a(b){
    alert(b);
    b=function(){
        alert(b);
    }
    b();
}
a(1);
/*
分析:
0:生成ao对象ao={}
1:分析参数ao={b:undefined}-->{b:1}
2:分析var声明--->没有
3:分析函数声明,--->没有,b=function(){}是一个赋值过程,是函数表达式返回值赋给变量b,这是一个赋值过程,要在执行过程中生效

执行:
alert(b);//1
b=function(){
    alert(b);
}
b();//function

*/

4.函数声明和函数表达式

js被称为披着c外衣的lisp语言,
lisp是一种强大的函数式语言
函数的地位比较高,函数可以作为参数来传递,可以复制给变量

function t1(){}//t1是函数声明
t2=function(){}//t2是函数赋值过程,值是右侧表达式的返回结果

//function(){}在js看来就是3+2一样,是一个表达式,返回一个结果
//因此,t1 t2 在词法分析过程有着明显的区别,前者在词法分析阶段就发挥作用,后者在运行阶段才发挥作用


(function (window.undefined){})(window);
//这是jquery的最外层代码
(function(window.undefined))//内层表达式,返回值是函数,包在小括号内,当成表达式来使用
(window)//立即调用,并传一个window

//而内层函数没有起名字,叫匿名函数,这种方法好处: 立即执行不污染全局,称为 立即执行匿名函数表达式

//为什么传window不传undefined?
//传window是为了速度,加快内部查找全局变量的速度,直接把window以参数形式传进来,这样window就在jquery内部的ao上

    function(){
        function(){
            function(){
                function{
                    function(){
                        document.getElementById()//这个document会将作用域层层上找,直到最外层
                    }
                }
            }
        }
    }

//不传undefined是为了安全,在ie低版本张,undefined竟然可以重新赋值,如undefined=3
//声明undefined局部变量(名字是undefined而已),同时又不传参,值自热是undefined,阻止了外界对undefined的污染

5.作用域链

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链
Js作用域与作用域链详解

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

推荐阅读更多精彩内容

  • 目录 1.静态作用域与动态作用域 2.变量的作用域 3.JavaScript 中变量的作用域 4.JavaScri...
    一缕殇流化隐半边冰霜阅读 7,089评论 37 113
  • 特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS...
    杀破狼real阅读 555评论 0 3
  • 刷朋友圈,看到大家都在写年终总结,想想再过几个小时,就要迈入新年,于是想凑个热闹也来写个总结,一方面写写2016年...
    bobo斜阅读 97评论 0 0
  • 刻意练习是黄金标准: 在某个领域和行业,必须有标准的训练方法,采用高度发展、被人们广泛接受的训练方法。如果某人谨慎...
    盛碗清水阅读 2,888评论 0 3
  • 爱上清静还爱上了一个人独处 从前喜欢喧嚣喜欢出现在人潮 如今更欣赏远灯火阑珊的自己 爱自由喜无拘束 嘿~自然风,我...
    许笑话阅读 279评论 0 1