运 test()和 new test()的结果是 么 ?

var a = 5; function test() {

a = 0; 
alert(a); 
alert(this.a); 
var a; 
alert(a);

}
求 运行 test() 和 new test()的结果

test()的结果为 0 5 0
但对于 new test 的结果 本人还是不太懂 有认识的大神 可以解答一下么

阅读 4k
2 个回答

主要的区别就是this的指向变了
直接调用test()时,this的指向是windowglobal
使用new调用 new test()时, this的指向变成被实例化的对象。

当你运行 test() 时,代码等价于:

var a = 5;

function test() {
    var a;
    a = 0;
    alert(a);
    alert(window.a);//浏览器端
    alert(a);
};

当你运行 new test() 时,是把 test 当作构造函数来用,这个时候,你首先要清楚 this 在构造函数中的指向问题,看测试:

function f(){
    console.log(this);
    console.log(this instanceof f);
}
f();// window;false;
new f();// f {} ;true

当作为构造函数来使用的时候,函数内的这个 this 就指向一个新的对象,这个对象是这个构造函数的实例,如果这个构造函数没有 return 或者 new 构造函数返回一个基本类型值的话,那这个 this 对象也是这个 new 构造函数的返回值;书上的话就是:

以这种方式调用构造函数实际上会经历以下4个步骤:
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此this 就指向了这个新对象);
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象。

回来看你的问题,new test() 代码实际是这样:

var a = 5;

function test() {
    var a;
    a = 0;
    alert(a);
    alert(this.a);
    alert(a);
};

let obj=new test();

当执行这句代码时:

let obj=new test();

new test() 里的 this ,指向的就是你用 new test() 所返回的对象,在这里,就是 obj ,而这个对象,你给他定义 a 属性了么?没有!所以 this.a 返回 undefined;考虑下面代码:

var a = 5;

function test() {
    var a;
    a = 0;
    alert(a);
    this.a=1;//新加
    alert(this.a);//返回1,因为前面给 this.a 赋值了
    alert(a);
};

let obj=new test();
console.log(obj.a);//1

最后的 log 出来的 obj.a 就证明了这个 obj 和你在 new test() 里面的 this 是同一个对象;

参考:JavaScript高级程序设计-第3版-中-注释.pdf

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题