函数内部运作机制
执行上下文(Context)
代码执行的环境
-
全局上下文: JS引擎产生代码环境,运行代码;声明变量——全局变量;
-
函数上下文:声明变量——局部变量;随上下文的销毁而销毁;
-
eval上下文:eval:把字符串以JS的方式运行;
变量对象 (VO)
所有上下文中都有一个变量对象存放所有变量(不包含值).
没有声明变全局变量 a=3;
每次调用产生新的上下文,用完了就删除,清内存。
AO:活动对象,运行中正处于活动状态
作用域链
作用域:环境所处的范围
space:保存上一层作用域链对象;产生:函数被创建(声明)时;谁创建函数就是该函数的上一级。
当var与函数变量名相同时,先提升函数声明,忽略var(var不提升,不覆盖)。
1、 var foo=1; function bar(){ // 声明foo、bar console.log(foo); // undefined 声明为赋值 if(!foo){ // 取反进if var foo=10; //声明提升到function里 } console.log(foo); // 10 } bar();
2、 var a=1; function b(){ a=10; // 局部变量 return; function a(){} //函数声明会提升 } b(); console.log(a); // 1
3、 var f=true; if(f===true){ var a=10; } function fn(){ var b=20; // b是局部变量,不能出去,只能在function里运行,运行完后消除,console.log(b);在function里会输出 20 c=30; // 全局变量 } fn(); console.log(a); // 10 //console.log(b); // 报错,b 未声明(not defined) console.log(c); // 30
4、 //var a=b=3; b=3, var a=b; // 或 var a=3,b=3; (function(){ //var a=b=5; b=5; // 全局 var a=b; // 局部 })(); console.log(a); // 3 console.log(b); // 5
5、 // 当var与函数变量名相同时,先提升函数声明,忽略var(var不提升,不覆盖) var foo='A'; console.log(foo); // A; 直接赋值 var foo=function(){ console.log('B'); //Function }; console.log(foo); // B foo(); function foo(){ console.log('C'); // Function } console.log(foo); // B,调用第二个var foo();
6、 var a=1; function b(){ console.log(a); // undefined a=2; // 只提升声明,不提升值 console.log(a); // 2 var a=3; console.log(a); // 3 } console.log(a); // 1 b(); console.log(a); // 1 // 1 undefined 2 3 1
-
编写程序遵循“高内聚,低耦合”基本原则。
-
函数内部运行机制:执行上下文:在不同的上下文中,声明变量产生不同结果
-
变量对象存放上下文中所有变量(不包含值);
一个变量没有用var、let声明,直接赋值,变全局变量。
当var和function变量名相同,先提升函数声明,忽略var(var不提升,不覆盖)。