JS原理:原型链、执行上下文、事件循环
预备知识
1 栈 stack
栈是类似于数组的一种数据结构。
2对象引用
//user1指向用户对象
//user1持有用户对象的引用
var user1={
name:"abc"
}
var user2=user1;
user2.name="张三";
console.log(user1.name,user2.name);//张三 张三
概念
执行上下文:某个函数或全局代码的执行环境,该环节中包含执行代码需要的所有信息
可以简单的理解为 执行上下文是一个对象,对象中包含了执行代码所需要的信息
当执行一个函数时,需要建立执行上下文,才正式开始执行
call stack(执行上下文栈):组织管理程序运行过程中的执行上下文
var a =2;
function bar(){
var i=3;
function foo(){
var b=4;
method();
}
foo();
console.log("123");
}
function method(){
console.log("abc");
}
bar();
执行栈:
-console.log函数的执行上下文
-method函数的执行上下文
-foo函数的执行上下文
-bar函数的执行上下文
-栈底:全局执行上下文
//永远执行栈顶的上下文,执行完一个就pop
执行上下文的内容
- vo:variable object ,变量对象,存放的是函数或全局代码执行过程中需要用到的局部变量
- scope:作用域
- this
vo是一个对象,调用函数或执行全局代码时创建
function foo(a,b){
bar(); //能调用吗? 能,因为VO里面有
functon bar(){
console.log("hello"):
}
}
foo(3,4);
foo函数的执行上下文建立过程:
{
vo:{
a:3,
b:4,
arguments:{。。。}
bar:指向一个函数
}
}
创建VO对象
1.确定形参值
2确定函数中所有的函数字面量声明
1.该函数必须是字面量声明,字面量声明提取到VO后,该声明失效
2如果当前VO中出现同名属性,直接覆盖
3确定函数中所有的变量声明(var).将其提取到上下文中,值为underdifined
1如果当前VO中出现同名属性,忽略
function foo(a,b){
console.log(a); //fn
console.log(b); //4
function a(){
console.log("a"); //不执行
}
var a=function(){
console.log("b");
}
a(); //b
var a=10;
console.log(a); //10
}
VO{
a:3,--》指向函数a--》指向函数b————》10
b:4,
}
var foo=1;
function bar(){
console.log(foo); //underfined
if(!foo){
var foo=10;
}
console.log(foo); //10
}
var a=1;
function b(){
console.log(a); //fn
a=10;
return;
function a(){}
}
b();
console.log(a); //1 函数结束,执行上下文消失
console.log(foo); //fn指向C
var foo="A";
console.log(foo); // A
var foo=function(){
console.log("B");
}
console.log(foo); // fn指向函数B
foo(); //B
function foo(){
console.log("C");
}
console.log(foo); //fn指向B
foo(); //B