第一题:闭包(注意环境)
在node执行环境
var name = 'window'//全局变量!=global.name;如果没有用var声明就是 var obj = { name: 'obj', say: function () { return function () { console.log(this.name);//undifine console.log(this);//global } } } var x = obj.say() x()//global.x() console.log(global.name); console.log(this);// {}
注意:全局变量name!=global.name
this 指向调用它所在方法的对象
1.首先看谁调用了方法, x()相当于是global.x(),所以第一个this.name指的是global.name;所以输出的是undifine
2.所以在方法内this指代的是global
3.单独使用this,在node环境中是{}
在浏览器执行环境
<script> var name = 'window'//在网页上,全局变量和window是对等的 var obj = { name: 'obj', say: function () { return function () { console.log(this.name);//输出window 观察是谁调用了它,在哪里调用了它 } } } var x = obj.say() x() console.log(this.name) </script>
注意:在网页中全局变量与window是对等的
x()相当于window.x(),而 window.name指的就是全局变量的name
第二题
var o = { a: 10, b: { a: 12, fn: function(){ console.log(this.a);//输出的是12 console.log(this);//输出的是b这个对象 } } } o.b.fn();
o.b.fn(),最近调用者是b,所以fn方法中的this指代的是b
第三题
var point = { x: 0, y: 0, moveTo: function (x, y) { // var that=this; // 内部函数 var moveX = function (x) { //1 // that.x = x; this.x = x; }; // 内部函数 var moveY = function (y) { //1 // that.y = y; this.y = y; } moveX(x); moveY(y); } }; point.moveTo(1, 1); console.log(point.x); //0 console.log(point.y); //0 console.log(x);//1 console.log(y);//1
1.传参给moveTo(1,1);将x=1,y=1传到函数内部,moveX(x)相当于globa.moveX(1) ,moveY(y)同理;所以函数moveX,moveY中的this指代的是global,this.x=x相当于 global.x=1;this.y=y相当于global.y=1;所以相当于全局变量