老师问下<不好意思视频出了这么久我还提问>  构造函数的属性《例如 this.name是怎么预编译的》?

来源:7-3 [JavaScript]ES3执行上下文

行云流水justdoit

2016-09-11 11:20

var foo = 1;

function main (){ console.log(foo); var foo = 2; function foo (){ console.log(foo); } console.log(this.foo); this.foo = 3; console.log(this.foo); }

 main();

 new main();

写回答 关注

3回答

  • 橙子111000
    2017-10-15 09:59:24

    剖析仅使用new main();的情况

    代码运行前首先创建全局上下文环境(按照课程说明先查询函数后查询变量)

    [global] = {
    main:function,
    foo:undefined
    this:window
    }

    运行时从上到下执行赋值语句:

    [global] = {
    main:function,
    foo:1
    this:window
    }

    跳过main函数中的内容直接执行到new main();代码运行前首先创建函数上下文环境

    [main] = {
    foo = function
    this:new Object()
    }

    由于var foo...与function foo()...同名,根据课程所述忽略变量foo

    运行时从上到下执行赋值语句:

    [main] = {
    foo:2
    this:new Object()
    }

    由于this中没有属性foo,console.log(this.foo)自然为undefined。若有误,望指正。

    我不清楚楼上怎么理解为function foo()被提前的.....

  • 行云流水justdoit
    2016-09-12 09:35:30

    谢了   ,我想问的是使用new时  this.foo是怎么预编译的?按控制台的答案是另外初始化了一个变量?

  • web_zhang
    2016-09-11 17:46:57

    var foo = 1;

    function main (){

                   console.log(foo);                  //  function foo ()

                   var foo = 2;

                   function foo (){

                                 console.log(foo);

                   }

                   console.log(this.foo);          //   main();时为1    new main();时为undefined

                   this.foo = 3;

                   console.log(this.foo);         //   3

    }

     main();

     new main();


    当用new来构造函数时,this的指向是 new main()的原型main();,this.foo就是main()中的function foo(),而变量申明var foo = 2;因为和function foo()重复,就会被忽略,在执行上下文时function foo ()会被提前,值暂时为undefined,所以console.log(this.foo);会返回undefined,这是我自己的理解,希望对你有帮助,有错误望老师纠正~

JavaScript深入浅出

由浅入深学习JS语言特性,且解析JS常见误区,从入门到掌握

281098 学习 · 1054 问题

查看课程

相似问题