javascript一道关于new操作符的小题目,求解?

题目很短,代码如下:

var param = 1;
function main(){
    console.log(param);
    var param = 2;
    console.log(this.param);
    this.param = 3;
}
main();
var m = new main();

打开chrome浏览器在控制台可以看到分别输出了: undefined,1,undefined,undefined.
小老弟不明白的是代码中的最后一句"var m = new main()"到底做了些什么,会导致多输出了连个"undefined"(输出结果前两个小老弟可以理解,后面两个理解不了),还望好心人教教小老弟,现行谢过了!

阅读 3.4k
6 个回答

既然前两个你知道为什么,那直接说后两个。

当你执行 new main() 的时候,实际上是以 main 为构造函数创建一个对象。这个时候函数体内的 this 就不是 window 了,而是要生成的对象。

如果你改成这样,在打印之前设置一个属性,就有输出了:

var param = 1;
function main(){
    console.log(param);
    var param = 2;
    this.param = 3;
    console.log(this.param); // 输出 3
}
main();
var m = new main();

this.param 是设置对象属性,不是变量,所以不会变量提升。

执行一句:

var obj = new main();

new操作符具体干了什么呢?其实就干了三件事情。

var obj  = {};
obj.__proto__ = main.prototype;
main.call(obj);

第一行,我们创建了一个空对象obj;
第二行,我们将这个空对象的__proto__成员指向了main函数对象prototype成员对象;
第三行,我们将main函数对象的this指针替换成obj,然后再调用main函数。

new main()时的第一个undefined好理解,param定义了但没赋值。第二个undefined是因为此时的this是新创建的空对象,也没对它的param赋值,故也是undefined。

new 操作可以分为3条语句,
var m = {};
m.__proto__ = m.prototype;
main.call(m, 参数)

首先执行main(),main函数里的this指向全局对象window,第一个console.log输出局部变量param,但是var仅声明提升,赋值不提升,所以打印undefined,第二个console.log输出window.param,即全局变量1。
其次执行new main(),main函数里的this执行即将new出来的新对象,即不再指向window对象,console.log(param)同样先寻找局部变量 console.log(this.param)输出该对象的param属性,但是main函数第四行才定义了this.param,所以使用console.log输出this.param的时候找不到,只能打印undefined。
建议看看《你不知道的JavaScript(上卷)》里有关this绑定的内容。

前面两个undefined,1是main();调用,this.param 始终是外面的param ,此时相当于

var param = 1;
function main(){
    var param ;    //变量提升
    console.log(param);  //undefined
    param = 2;
    console.log(this.param); //this是window;而window.param = 1;也就是外面那个 var param = 1;这里打印param的话为2;
    this.param = 3; //这个相当于window.param = 3,这个后面打印this.param的话为3,param 为2
}

后面两个undefined,undefined;是new main();第一个undefined同上,而第二个undefined是由于new main()把main()中的this指向了m,this.param不再是window.param,而m.param或者说this.param没赋值,所以为undefined

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