js中作用域问题

转载地址:
http://blog.csdn.net/itzhengmaolin/article/details/54565201

作用域:在一定的范围内,对其进行读、写操作“js解析器”执行的过程至少2步:1、"找一些东西":比如 var 、function、参数2、逐行解读代码例:
alert(a);var a=1;function fn1(){ alert(2);}
解析过程:
1、JS的预解析过程 原则:遇到重名的:只留一个(变量和函数重名了,就只留下函数。无论变量在上还是函数在上,与上下是没关系的,跟有值没值有关系。因为变量=undefined,函数=整个函数块,相比之下有具体值的级别更大)
找到var关键字,然后定义其变量名等于undefined,不会管后面的值(在"JS解析器"执行的过程中,所有的变量都等于未定义) 如:a=undefined
找到function关键字,然后用其函数名等于其整个函数块。(所有的函数,在正式运行代码之前,都提前赋了一个值,这个值为整个函数块) 如:fn1=function fn1(){alert(2);}

2、逐行解读代码过程: 表达式可以修改"预解析"的值。函数的声明不属于表达式,改变不了什么东西这个过程遵循"从上往下,从左往右"的顺序执行。当执行一句完毕后,到仓库中查找是否有这个"东西"(变量、函数等)。如果有则弹出其一开始在仓库的值(使用alert方法)遇到表达式(=+ - * / % ++ -- ! 参数……等即能改变值的东西)简单来说,找var 、function、参数,并将变量赋值为undefined、函数名=整个函数,然后将他们存储在仓库中,在进行逐行解读代码的时候,在仓库中提取或修改

练习:



解析过程
1、找关键字(var、function、参数)找到37行的"var a",执行过程:a=undefined找到39行的"function a(){alert(2);}",执行过程:a=function a(){alert(2);}因为仓库里有重名的a,所以要比较优先级,值为函数的大于值为未定义,所以执行过程为a=function a(){alert(2);}找到41行的"var a ",执行过程:a=undefined因为仓库里有重名的a,所以要比较优先级,值为函数的大于值为未定义,所以执行过程为a=function a(){alert(2);}找到43行的"function (){alert(4);}",执行过程:a=function (){alert(4);}因为仓库里有重名的a,所以要比较优先级,值同为函数则比较先后,后面的覆盖前面的,所以执行过程为a=function a(){alert(4);}2、逐行解析:从上往下,从左到右依次执行代码。从36行开始,a的一开始值为function a(){alert(4);}执行37行时,修改仓库中a的值,则变为1执行39行时,并不影响a的值,所以a的值还是1后面亦是如此

一个页面两个script标签,浏览器遇到script标签会用"js解析器"来解析,只有解析完第一个script标签的内容后在执行下一个script标签内的内容,所以下面alert(a); 会报错 a is no defined。



这就是当引用别人写的jQuery库时,在对其修改

var a = 1;
function fn1()
      {
         alert(a); //undefined var a = 2;
       }
fn1();
alert(a);           

//1解析过程:
1、预解析:a=undefined;fn1=function fn1(){ alert(a); var a = 2;}
2、逐行解析;a=1遇到函数调用fn1() --函数也是一个局部的域,只要是一个域就会发生预解析和逐行解读代码。相当于其有一个小的仓库。可以理解为1个大仓库包含着1个小仓库,大仓库里的a和小仓库里的a是不同的世界,互不影响。函数调用属于表达式 函数里的预解析: a=undefined; //这里的a是局部的,外面的是全局的,两者没关系 函数里的逐行解析: 执行函数里的alert(a); 先找局部仓库里的a,所以弹出undefined 在执行函数里的var a=2; 所以局部里的a=2,并没有影响全局中的a=1 函数执行完毕后会有垃圾回收机制等
函数调用完毕后,继续全局的逐行解析

var a = 1;function fn1(){alert(a); // 1a = 2;      

//注意这里没用var声明}fn1();alert(a); // 2函数里的预解析过程为空,执行函数里的逐行解析代码:当执行到alert(a);没找到a,会顺着函数的作用域跳到上一级(从子级作用域返回到父级作用域的过程叫作用域链,由里到外找)。执行到"a=2"时,发现小仓库里没有a,则由里到外找,找到其父级有a,则修改a的值为2
所以,加var与不加var的区别体现出来了。不加var,会修改全局变量的值

var a = 1;function fn1(a){alert(a); // undefineda = 2;}fn1();alert(a); // 1

参数本质就是一个局部变量。跟上面的其中一种情况(如下)很类似函数预解析时没有发现var、function ,却发现了参数,所以a=undefined。然后逐行解读代码,当读到"alert(a);",执行结果为undefined当读到"a=2;",它会就近找小仓库里有没有a,执行结果为a=2,全局的a还是1不影响

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

推荐阅读更多精彩内容

  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,640评论 0 6
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,718评论 2 17
  • 变量和函数的提升可以分成两步: 1 js先预解析:把变量和函数声明提升到作用域顶端,我理解的意思是在浏览器中找一些...
    miner敏儿阅读 257评论 0 0
  • 39 又一次樊登读书会线下活动,这次的主角变成了小朋友,人家原是要求3到7岁的孩子参加,到场的还是有十岁孩...
    锦莉阅读 1,636评论 1 1
  • 当你第一次打开一款应用的时候常常会看到精美的引导页设计,它们在你未使用产品之前提前告知你产品的主要功能与特点,第一...
    Air7777777阅读 10,972评论 9 109