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