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:作用域thisvo是一个对象,调用函数或执行全局代码时创建
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