JavaScript的预编译
JavaScript是一种脚本语言,如果没有弄清预编译的过程,会形成误区,从而出现一些问题。
全局的预编译
一般理解的预编译就是检查语法错误,内存会开辟一部分地址,用来存放对象,了解一些细节,可能会更好地理解预编译:
1. 全局对象(global object):浏览器引擎首先会生成GO对象,并定义一些初始属性,比如全局属性、全局函数等等,这些属性js程序都可以使用;
2. 解析声明的变量:
比如下面的程序:
//code1
var b ;
console.log(b) // undefined
//code2
console.log(a) // undefined
var a = 5 ;
console.log(a) // 5
预编译时,变量以undefined的形式存储。
你看到的代码块:
//code3
console.log(a) // undefined
var a = 5;
console.log(a) // 5
var b = 3
实际执行的顺序:
//code4
var a ;
var b ;
console.log(a) ;
a = 5 ;
console.log(a) ;
b = 3
所以code2的第一个打印是undefined。
3.解析函数声明:
存储函数名和函数体,如果函数名和变量名相同,则会覆盖。
var a;
function a() {
}
console.log(a)//ƒ a() {}
函数的预编译(局部)
函数预编译发生在函数执行的前一刻。
活动对象(active object):函数调用,也会生成作用域。
- 分析参数,解析形参和实参;
- 分析变量,和全局预编译的变量相同;
- 分析函数声明,也可以理解为对象,函数名为属性名,函数体为值;
- 匿名函数不参与预编译。
理解 预编译 能对作用域,this指向等方面有更好的理解
–
Global对象中有
unescape();
对由 escape() 编码的字符串进行解码, 把乱码变中文
var str = '%u5927%u50BB%u903C';
alert(unescape(str))