个人笔记 不足请指正。
js在执行时
语法分析
在执行之前会通篇扫描 有没有语法错误
1.imply global 暗示全局变量,即任何变量,如果变量未经声明就复制,此变量就为全局所有。
2.一切声明的全局变量,全是window的属性
函数执行的前一刻:
1.创建AO对象
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
(函数声明整体提升,变量声明提升)
3.将实参值和形参统一
4.在函数体里面找函数声明,赋予函数体
执行js
了解执行上下文要先了解下边两点
1.栈
栈是类似于数组的一种数据结构
2.引用对象
如果变量是一个对象,实际上变量中存放的是对象的地址
执行上下文:某个函数或全局代码的执行环境,该环境中包含执行代码需要的所有信息
可以简单的理解为:执行上下文是一个对象,对象中包含了执行代码所需要的信息
当执行一个函数时,需要建立执行上下文,建立之后,才正式开始执行。
call stack(执行上下文栈):组织管理程序运行过程中的执行上下文。
执行上下文的内容
1.VO:variable object , 变量对象,存放的是函数或全局代码执行过程中需要用到的局部变量
2.scope:作用域
3.this
VO是一个对象,调用函数或执行全局代码时创建,创建一个vo,需要经过三步:
1.确定函数形参的值(包括arguments对象)
在函数中寻找数据是,会先从vo中查找,如果vo中不存在,在使用外层数据
AO :active object 执行栈顶上下文的vo
也有人叫VO叫GO,在这里是没有区别的
GO:Global Object
创建vo对象
1.确定形参值
2.确定函数中所有的函数字面量声明
1.该函数必须是字面量声明,字面量声明提取到vo后,可以认为该声明失效
2.如果当前vo中出现同名属性直接覆盖
3.确定函数中所有的变量声明(var),将其提取到上下文中,值为undefined
1.如果当前vo中出现同名属性,忽略
下面来做几道测试题
user1变量是一个对象,user1存放的是对象的地址
user2=user1 故指向同一个地址
当第10行改变name时 因为user1和user2指向同一个地址
故console.log(user1.name)输出的是张三
在实际开发中为了避免出现这种情况通常会对一个对象深拷贝在赋给另一个变量;
19执行,16输出1
输出。abc ,123
试题3:
console.log(foo)//function
var foo="A";
console.log(foo); //A
var foo=function(){
console.log("B")
}
console.log(foo);
foo();
function foo(){
console.log("C")
};
console.log(foo)
foo()
试题4:
var foo=1
function bar(a){
var a1=a;
var a=foo;
function a(){
console.log(a)
}
a1()
}
bar (3)
bar 里的函数a又一个vo建立了
vo{
}
bar的上下文
vo{
a:指向函数a,
a1:指向函数a,
}
全局上下文
vo{
bar :指向函数bar;
foo:1;
}
不同的作用域。就会生成不同的vo ao