关于两个小东东的分析(函数执行值与函数的预编译跟解释执行阶段)
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阅览器里看到这篇文章时,还没有评论,还不赶紧过来抢沙发?
相关文章推荐
- 关于T-SQL重编译那点事,内联函数和表值函数在编译生成执行计划的区别
- JavaScript立即执行函数的解释分析(4)—总结篇
- OO 中的继承分析:主要分析在编译和运行过程中 子类、父类 的字段和方法以及实例化时候在内存中分配 和 执行的先后,以及两个原则
- JavaScript是解释型语言,是不需要编译的,浏览器直接解释源代码,并执行在内存中创建变量等操作。不需要编译,即不存在什么语法不语法的,因为没有编译阶段,直接在运行的阶段才发现有没有语法错误
- 关于 接口与对象指针对成员函数的调用时的汇编执行行为分析
- JavaScript立即执行函数的解释分析(3)—谈谈圆括号()
- 关于python代码是编译执行还是解释执行
- OO中的继承分析,主要分析在编译和运行过程中子类父类的方法、字段和实例化时候在内存中分配和执行的先后,以及两个原则
- 关于执行free函数的时候提示” double free or corruption“错误的解释和解决办法
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- JavaScript立即执行函数的解释分析(2)—函数表达式与函数声明的区别
- JavaScript立即执行函数的解释分析(4)—总结篇
- 关于函数的参数为类的引用时编译错误的分析
- JavaScript立即执行函数的解释分析(1)—表达式与语句的区别
- JavaScript立即执行函数的解释分析(3)—谈谈圆括号()
- 关于T-SQL重编译那点事,内联函数和表值函数在编译生成执行计划的区别
- 关于JavaScript预编译和执行顺序以及函数引用类型的思考
- Jquery 中两个页面载入后执行的函数的分析区别
- JavaScript立即执行函数的解释分析(2)—函数表达式与函数声明的区别
- SQL Server 第四堂课,创建存储过程。存储过程是一组编译在单个执行计划中的transact-SQL语句。存储过程相当于C#函数,可以允许模块化程序设计,允许更快执行如果某操作需要大量transct-SQL代码或需要重复执行,将在创建存储过程中对其进行分析和优化。