翼度科技»论坛 编程开发 JavaScript 查看内容

执行上下文

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
变量提升与函数提升

变量声明提升


  • 通过var定义(声明)的变量--在定义语句之前就可以访问到
  • 值为undefined
  1. console.log(a);        //undefined
  2. var a = 1;
  3. //执行顺序
  4. var a;
  5. console.log(a);
  6. a = 1;
复制代码
函数声明提升


  • 通过function声明的函数--在之前就可以直接调用
  • 值为函数定义(对象)
  1. fn();//可调用
  2. function fn(){
  3.     conse.log('哈哈');
  4. }
复制代码
执行上下文

代码分类--位置

全局代码
函数(局部)代码
全局执行上下文


  • 在执行全局代码前将window确定为全局执行上下文

    • 对全局数据进行预处理
    • var定义的全局变量-->undefined--添加为window的属性
    • function声明的全局函数-->赋值--添加为window的方法
    • this-->赋值window
    • 开始执行全局代码
    1. //全局执行上下文
    2. console.log(a1, window.a1);  //undefined undefined
    3. a2();   //a2();
    4. console.log(this);  //window
    5. var a1 = 3;
    6. function a2() {
    7.     console.log('a2()');
    8. }
    9. console.log(a1);
    复制代码
函数执行上下文


  • 在调用函数--准备执行函数体之前--创建对应的函数执行上下文对象--虚拟的,存在于栈中

    • 对局部数据进行预处理
    • 形参变量-->赋值(实参)--添加为执行上下文的属性
    • arguments-->赋值(实参列表)--添加为执行上下文的属性
    • var定义的局部变量-->underfined--添加为执行上下文的属性
    • this-->赋值(调用函数的对象)
    • 开始执行函数体代码
    1. //函数执行上下文
    2. function fn(a1) {
    3.     console.log(a1);    //2
    4.     console.log(a2);    //undefined
    5.     a3();   //a3
    6.     console.log(this);  //window
    7.     console.log(arguments); //2,3
    8.     var a2 = 4;
    9.     function a3() {
    10.         console.log('a3');
    11.     }
    12. }
    13. fn(2, 3);
    复制代码
执行上下文栈


  • 在全局代码执行前--JS引擎会创建一个栈来存储管理所有的执行上下文对象
  • 在全局执行上下文(window)确定后--将其添加到栈中(压栈)
  • 在函数执行上下文创建后--将其添加到栈中(压栈)
  • 在当前函数执行完后--将栈顶的对象移除(出栈)
  • 当所有代码执行完成后--栈中只剩下window
  1. [/code][align=center][/align]
  2. [size=5]面试题[/size]
  3. [code]console.log('gb:' + i);
  4. var i = 1;
  5. foo(1);
  6. function foo(i) {
  7.     if (i == 4) {
  8.         return;
  9.     };
  10.     console.log('fb:' + i);
  11.     foo(i + 1);
  12.     console.log('fe:' + i);
  13. }
  14. console.log('ge:' + i);
复制代码
  1. function a(){};
  2. var a;
  3. console.log(a); //f a(){}--变量先被提升--函数覆盖变量后提升
  4. if(!(b in window)){
  5.     var b = 1;
  6. }
  7. console.log(b); //undefined--变量先被提升为全局变量
  8. var c = 1;
  9. function c(c){
  10.     var c = 3;
  11. }
  12. c(2);   //报错--变量先被提升--函数后被提升--变量最后被赋值--因此不是函数,不能被调用
复制代码
来源:https://www.cnblogs.com/Liu-h/p/17337906.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具