我的笔记 不足请指正。
数组
js在执行时数据结构
语法分析函数
在执行以前会通篇扫描 有没有语法错误测试
1.imply global 暗示全局变量,即任何变量,若是变量未经声明就复制,此变量就为全局全部。this
2.一切声明的全局变量,全是window的属性cdn
函数执行的前一刻:对象
1.建立AO对象blog
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