javascript--词法分析

来源:互联网 发布:淘宝买衣服 如何换货 编辑:程序博客网 时间:2024/06/15 11:54




<!DOCTYPE html><html><head><title></title><script type="text/javascript">/*作用域 解释:变量的作用域在自己所在的这个函数*//*var a=1;function t1(){var b=2;function t2(){var c=3;alert(a+b+c);}t2();}t1();*///  ==6  函数嵌套很普遍 首先变量函数里寻找 找不到再到外层 直到最外层/*Q var 函数里什么时候要加A var是在函数运行的上下文中声明一个变量没加var 仅仅是赋值操作  但不要狭隘的理解为全局*//*alert(window.d);//undefiedalert(window.e);//undfunction t(){d=5;//赋值操作 函数内找不到var(声明操作) 直到最外层, 写了个全局 window.d=5;var e=6;//var 函数内的变量,在全局内声明就是全局,这里是函数里声明}t();alert(window.d);//5alert(window.e);//und*//*Q一个加window.d 一个不加win,什么区别A   用一个没有的变量测试,有win的引用全局变量时,是作为某个属性不存在返回un不加win 是报 xxxis not und ,上面一个轻微一点 *//*function t1(){var d;function t2(){d=5;//这边赋值,往外找,在t1找到e=6;//同上面一个例子 全没找到,就写了个全局}t2();}t1();console.log(e);// == 6 因为写下面的下面就报错不执行下去了console.log(window.d);//und console.log(d);//因为全局 所以is not defied*//*var加不加对找不到这个变量的影响和加不加win类似*/var str1='tama';function t1(){console.log(str1);//存在的变量  打印变量console.log(str2);//执行到这行时 在函数t1内找没, 又到外层全局寻找str2   str2 = 'beef';//到这行 才把全局赋上值,如果上下两行颠倒就能显示出来了var str2= 'bee';}t1();//tama  beef   is not defied// tama bee   undefied</script></head><body></body></html>

为什么会有undefied和is not defined区别呢




这就要引出这个了----词法分析

js代码自上而下执行
但是在整体运行分:
词法分析期
运行期
自上而下执行之前,先有一个词法分析过程 就是下面说的

js里的函数运行解析
0.函数运行前 生成 Active Object(活动对象,缩写AO)
从函数的三个看:参数(函数名后括号里的),变量声明(有var的),函数声明(function)
1.参数 形成AO的属性,值为undefined,如有==那个值
2.变量 同上 但若已存在,则不改变
3.函数 例:function foo(){}  赋给foo属性,若已存在,则覆盖


function a(b){alert(b);function b(){alert(b);}b();}a(1);/*词法分析ao.b=und  1alert也算var 因为已存在不改b() ao.b=func b....运行期 依次alert,没有其他变化,所以两次alert都是func*/



function a(b){// alert(b);var b=1;function b(){alert(b);}b();}a(1);/*alert 改为var b=1词法分析期不变 运行期 赋值操作 把函数用1代替了 运行的话,会说b()不是function type 把alert放在1那行后面就能看到打印为1*/



function a(b){alert(b);b=function b(){alert(b);}b();}a(1);/*词法分析ao.b= 1 alert也算var 因为已存在不改只有这两行,没有函数运行期alert    1b= ...   赋值 b为函数 */



0 0
原创粉丝点击