普通this指针指向问问题:
-
1.预编译过程中的this–>window
-
2.全局作用域中的this–>window
-
3.一般情况下的this–>调用者(谁调用指向谁);
-
4.call/apply,改变this指向,指向第一个参数
-
5.object.function(){} this–>object;
-
6.普通函数中的this,是window;
-
7.对象.方法中的this是当前对象;
-
8.定时器的this是window;
-
9.构造函数中的this是实例对象;
-
10.原型对象中的this是实例对象。
-
全局环境下的this
- 在全局环境下,this指针始终指向的全局对象(window);
console.log(this===window);//true
第一题:
var x = 3;
var foo = {
x: 2,
baz: {
x: 1,
bar: function() {
return this.x;
}
}
}
var go = foo.baz.bar;
alert(go());
alert(foo.baz.bar());
- 1,2
- 1,3
- 2,1
- 2,3
- 3,1
- 3,2
答案:3,1
解答:
var go = foo.baz.bar; --> go = this.x ---> go 的作用域是全局,所以是 window。
this指向执行时刻的作用域,go的作用域是全局,所以相当于window,取到的就是window.x,也就是var x=3;这里定义的x。
foo.baz.bar() ---->
而foo.baz.bar()里面,this指向foo.baz,所以取到的是这个上面的x,也就是1。
第二题:
var x = 4,
obj = {
x: 3,
bar: function() {
var x = 2;
setTimeout(function() {
var x = 1;
alert(this.x);
}, 1000);
}
};
obj.bar();
- 1
- 2
- 3
- 4
- undefined
答案:4
解答:
4,不管有这个setTimeout还是把这个函数立即执行,它里面这个function都是孤立的,this只能是全局的window,即使不延时,改成立即执行结果同样是4。
第三题
x = 1;
function bar() {
this.x = 2;
return x;
}
var foo = new bar();
alert(foo.x);
- 1
- 2
- undefined
答案:2
这里主要问题是最外面x的定义,试试把x=1改成x={},结果会不同的。这是为什么呢?
在把函数当作构造器使用的时候,如果手动返回了一个值,
- 要看这个值是否简单类型,如果是,等同于不写返回,
- 如果不是简单类型,得到的就是手动返回的值。
- 如果,不手动写返回值,就会默认从原型创建一个对象用于返回。