关于javascript中函数闭包和构造函数返回值的问题?

请看上面这段代码,为什么会出现两种不同的结果?还有如果test()作为构造函数有返回值会是什么情况?返回值是基本类型的值是什么结果?返回值是引用类型会是什么结果?求高手解答,感谢!
最新回答
那一抹浅笑

2024-03-20 18:07:23

首先,

1

用test构造函数来实例化一个对象。执行到第17行的时候:

1

设置了一个当前对象的属性age=50;

但是,第18行:

1
2
3

相当于,返回了这个匿名函数作为当前对象(m)。也就是覆盖了由test函数构造的对象。也就是age已经没有了。这时,看看m.age。会是undefined。

而第23行:

1

就是执行上面返回的匿名函数。this是什么? this是window对象。那this.age是什么呢?就是最上面定义的100;

对于第二种情况,代码25行:

1

就是一个普通的执行函数。那么在第17行:

1

发生了什么呢?首先,确定this,也就是当前作用域什么什么。由于不是构造函数执行。那么,普通的函数执行的作用域应该为window。也就是第17行,相当于把window的age属性设置为50了。也就是最上面定义的变量。

那在执行26行:

1

和执行23行代码效果一样。因为age在执行17行的时候已经变成50了。so~就是50了。

var m = new test();
this.age = 50;
return function (){
    return this.age;
}
m();
var n = test();
this.age = 50;
n();
如一

2021-06-08 13:45:49

楼下答的基本正确。但是比较啰嗦,反而难懂了。

new运算符的时候会生成一个对象,叫做空对象。然后调用new运算符后面的函数,也就是类,
执行的过程,会把this绑定到空对象上。所以第一个把this是绑定到了生成的空对象上。
所以这个空对象有了age=50的属性。但返回的是函数,不是这个对象。函数中的函数这是闭包,闭包里面的函数的this指向跟是不是闭包没有关系,它依然指向window,于是,你的第一个显示100.

第二个没有生成对象。依然是闭包跟this没有关系,两个函数的调用都指向了window,所以第一次执行 修改为50了,第二次执行显示50。

这也是JS的难点之一,祝福你早点掌握~
用青春做赌注

2022-03-24 06:32:05

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
呆萌没商量

2023-09-24 21:35:40

如果在一个函数前面带上new来调用该函数,那么this将被绑定到那个新对象上.
第一次使用 了 new this指几当前对象
第二次没有使用 this 指向windows
var age=100;
function test()
{
    this.age=50;
    return function()
    {
        return this.age;
    }
}
var m=new test(); 
//构造函数改变上下文this变为m;改变了m的age值为50,此时m=function(){return this.age}
alert(m());
//此时上下文环境为window,得出window.age=100;
var n=test();
alert(n());
//等同于alert(test()())
//因为上下文环境一直是window,test()时改变了age的值为50,所以test()()时返回50
 
//如果构造函数中返回的是非对象,则被忽略
//如果返回的是对象,则this指向返回的对象,但是原型链会出错。