变量对象(VO): 变量和执行上下文相关,那么它就应该知道数据存储在哪里以及如何访问这些数据,三种形式:
1:变量
2.函数声明
3.函数形参
所有执行中的变量都会存储在这个VO中
var a =1;
function fn(){console.log(a);var a =2;}
fn()
console.log(a);
* 解析1.第一行var定义的变量a=undefined
2.fn就是函数本身vo定义如下:vo={a:undefinedfn:}* 开始执行代码1.第一行 表达式将修改 a=12.第二到五行声明函数
3.到了fn() 开始执行函数此时函数为 一作用域,只要存在作用域 就先解析所有在函数fn内部1.解析 a=undefined在fn内部 ao定义如下:ao(fn)= {a:undefined}2.执行fn内部第一行 弹出undefined第二行 把a赋值为2(这里的a是在fn中的局部变量 和外包的a全局变量不同)
4.最后一行打印全局变量a=1;说明 如果把functionfn(){console.log(a);a =2; (把var去掉 此事的a 变成了全局变量)}
var foo =1;
function bar(){foo =10;
return;
functionfoo(){}}
bar();
console.log(foo)
* 解析阶段(进入执行上下文)vo = {foo: undefinedbar: }* 执行代码阶段
1. 第一行foo=1;
2.第6行执行函数bar() (第二行到第5行的定义的函数)在函数bar的内部又有解析和执行阶段表示如下:vo(bar) = {foo: }执行阶段在函数bar内部的第一行foo=10(这里需要注意的是 foo是bar的局部变量 不会影响 外面全局的变量foo)
3: 最后一行console.log()foo=1;
var foo=1;
function bar(){foo=10;return function foo(){ };}
bar( );
alert(foo);
最后对于这道题 为什么结果是10不是1你只要明白return function foo(){ }; 其实是一个函数表达式 不是函数定义. 原因就在这里vara =1;function fn(a){console.log(a);a =2;}fn(a)console.log(a); 这道题关键在于fn(a) 其实就是 fn(1) 在函数内部 解析阶段 a=1(这里a在函数内部 是形参 a=2也是改变fn内的局部变量 不影响全局的a )
网友评论