关于预解析和执行期上下文,看完这个你就都会了
预编译
简单理解记忆
- 函数声明整体提升 系统会把函数提升到逻辑的最前面
- 变量 声明提升
这两句话不能解决的问题
console.log(a);
function a(a) {
var a = 234;
var a = function () {
}
a();
}
var a = 123;
未经声明的变量归window所有
- imply global暗示全局变量:即任何变量,如果
变量未经声明就赋值,此变量就为全局对象所有。
eg:a= 123;eg: var a=b= 123; - -切声明的全局变量,全是window的属性。window就是全局的域
eg:var a = 123; ===> window.a = 123;
预编译过程 发生在函数执行的前一刻
1.创建AO对象:执行期上下文
2找形参和变量声明,将变量和形参名作为AO
属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
例子1:
function fn(a) {
console.log(a);//function a() {}
var a = 123;
console.log(a) ;//123
function a () {
}
console.log(a);//123
var b = function () {
}
console.log(b);//function () {}
function d() {
}
Fn(1);
预编译过程:AO{
a:function a () {}
b:undefined,
d:function d() {}
}
例子2
function test(a, b) {
console.log(a) ;//1
C=0;
var C;
a=3;
b=2;
console.log(b) ;//2
function b () {
}
I
function d ( )
{
}
console.log(b) ;//2
test(1);
例子3
function test(a, b) {
console.log(a) ;//function a () {}
console.log(b);//undefined
var b = 234;
console.log(b);//234
a = 123;
console.log(a);//123
function a () {
}
var a;
b = 234;
var b = function ( ){
}
console.log(a);//123
console.log(b) ;|//function () {}
}
test(1);
AO {
a:function
b:1
}
有全局的执行期上下文的时候
console.log(test);//function text () { }
function test(test) {
console.log(test) ;//function text () { }
var test = 234;
console.log(test);//234
function test( ){
}
}
test(1) ;
var test = 123;
过程 :
在全局的执行期上下文:
GO {
text :function text () { }
}
函数执行的执行上下文
AO {
}
复杂的面试题例子:
function test() {
console.log(b);//undefined
if (a) {
var b = 100;
}
console.log(b)//undefined
c = 234;
console.log(c);//234
}
var a;
test();
// AO{
// b: undefined
// }
a = 10;
console.log (b);//Uncaught ReferenceError: b is not defined
console.log(c);//234
tip:>(免费获取最新完整前端课程关注vx公众号:前端拓路者coder,回复:资料
如果这个文章对你有用的话,欢迎点赞转发关注,让更多的小伙伴看到呀,毕竟分享是一个程序员最基本的美德!!!
如果有不对的请大佬指教)