您的位置:首页 > 其它

关于两个小东东的分析(函数执行值与函数的预编译跟解释执行阶段)

2012-06-25 23:02 267 查看
[crayon-50361f9fb7bfc/] 开始会弹出undefined 之后会弹出zhang3 为什么呢 因为第一次执行doit()后 doIt没返回值 。可以写段代码测试一下 [crayon-50361f9fb7fda/] 第二次执行弹zhang3就比较简单了,因为默认this指向window   狸子2 [crayon-50361f9fb83c2/] 弹10 [crayon-50361f9fb87a3/] 弹1 其实简单理解:函数分为“预编译”“解释执行”两个阶段。 1. 在执行前会进行类似“预编译”的操作:首先会创建一个当前执行环境下的活动对象,并将那些用var申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是undefined,并将那些以function定义的函数也添加为活动对象的属性,而且它们的值正是函数的定义。 2. 在解释执行阶段,遇到变量需要解析时,会首先从当前执行环境的活动对象中查找,如果没有找到而且该执行环境的拥有者有prototype属性时则会从prototype链中查找,否则将会按照作用域链查找。遇到var a = …这样的语句时会给相应的变量进行赋值(注意:变量的赋值是在解释执行阶段完成的,如果在这之前使用变量,它的值会是undefined) var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); 首先初始化 foo  ,置undefined if(!foo) 完了,是undefined,这个表达式为真 注意,以上为预编译阶段 执行var foo =10,更新作用域中的foo 输出foo //10 简单一句话 解析作用域(预编译)时候,该作用域里面不管哪行定义了东西,都可以简单想象成第一行声明了一个未初始化的同名变量。 var a = undefined »本文地址:http://99jty.com/?p=631 »订阅本站:http://winysky.com/feed/»当你从RSS阅览器里看到这篇文章时,还没有评论,还不赶紧过来抢沙发?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐