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

2025-01-19 12:48:28
推荐回答(4个)
回答1:

首先,

var m = new test();

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

this.age = 50;

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

但是,第18行:

return function (){
    return this.age;
}

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

而第23行:

m();

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

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

var n = test();

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

this.age = 50;

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

那在执行26行:

n();

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

回答2:

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

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

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

这也是JS的难点之一,祝福你早点掌握~

回答3:

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指向返回的对象,但是原型链会出错。

回答4:

如果在一个函数前面带上new来调用该函数,那么this将被绑定到那个新对象上.
第一次使用 了 new this指几当前对象
第二次没有使用 this 指向windows