关于js解析执行有趣的事
来源:互联网 发布:安卓手机c语言编程软件 编辑:程序博客网 时间:2024/05/01 16:59
- var foo = 1;
- function bar() {
- if (!foo) {
- var foo = 10;
- }
- alert(foo);
- }
- bar();
- var a = 1;
- function b() {
- a = 10;
- return;
- function a() {}
- }
- b();
- alert(a);
大家看输出的是什么?
第一题
10
第二题
1(局部和全局变量不同)
解释原因:
1.通俗解释
想简单理解的话,可以想象在第一个例子的函数bar进入时候第一行加一行
var foo = undefined
在第二个例子的函数b的第一行加一个
var a = undefined
解析作用域时候,该作用域里面不管哪行定义了东西,都可以简单想象成第一行声明了一个未初始化的同名变量。
(纯粹为了容易理解)
2.专业解释
这关系到JS解析顺序的问题,当JavaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理。
做如下处理:
1. 在执行前会进行类似“预编译”的操作:首先会创建一个当前执行环境下的活动对象,并将那些用var申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是undefined,并将那些以function定义的函数也添加为活动对象的属性,而且它们的值正是函数的定义。
2. 在解释执行阶段,遇到变量需要解析时,会首先从当前执行环境的活动对象中查找,如果没有找到而且该执行环境的拥有者有prototype属性时则会从prototype链中查找,否则将会按照作用域链查找。遇到var a = ...这样的语句时会给相应的变量进行赋值(注意:变量的赋值是在解释执行阶段完成的,如果在这之前使用变量,它的值会是undefined)
换个角度来说,这个是函数体升迁的问题,如果是用 var fn = function() 这种形式来定义,那么 fn 会升迁,但是函数体不会升迁,因此会报告错误说 fn 不是一个方法(注意不是报告未定义),而如果使用 function fn() 来定义方法,那么 fn 和函数体会同时升迁,这样 fn() 是可以调用到结果的。
- 关于js解析执行有趣的事
- 有趣的js应用
- 有趣的js时钟
- 有趣的js点灯
- js的解析与执行过程
- js的解析和执行过程
- JS 的解析与执行过程
- Js的全局预处理、解析与执行
- JS的解析与执行过程
- 关于动态执行代码(js的Eval)
- 关于JS函数的语法分析和执行
- JS: 关于自执行的匿名函数
- 关于js中函数的执行顺序
- 关于JS执行顺序的问题
- js 有趣的时钟 --仅供参考
- js+flash 有趣的时钟
- js有趣的一行交换
- 关于疯子的有趣测试!
- 我渴望的教育
- java_web里面的代码,想复习一下曾经写过的代码
- 关于齐次坐标系的笔记
- 小问题 汇总(不断更新)
- centOS配置ganglia
- 关于js解析执行有趣的事
- 深入浅出之正则表达式(二)
- java输入输出
- 关于Cadence16.5和Cadence15.5共存的安装方法
- MFC自定义消息四步曲
- chukwa 学习———— JAX-RS
- The Tom Kyte Blog: When the explanation doesn't sound quite right...
- NHibernate链接access数据库的配置文件
- 使用GIT工具获取android应用程序源代码