this-3
this是什么?
JavaScript中,this关键词指的是他所属的对象;
它拥有不同的值,具体取决于它的使用位置。
1、在单独情况下,this指向全局对象window;
2、在函数中,this指向全局对象window;
3、在严格模式的函数中,this为undefined;
4、在对象的方法中,this指的是所有者对象;
5、在事件中,this指的是接收事件的元素;
6、使用call/apply方法,可以将this引用到任何对象。
上述1/2可以说明普通函数中,内层函数不能从外层函数中继承this的值,在内层函数中,this会是window或是undefined。
临时变量self用来将外部this值导入到内部函数中(另外的方式是在内部函数执行bind(this))
<script>
// var a = 43;
function foo() {
var a = 0;
console.log(this.a); // 2
return function (a) {
console.log(this.a); // undefined或43 把var a = 43; 注释掉,会打印出undefined,不注释就是43(说明上述1/2点)
};
}
var obj = { a: 2 };
foo.call(obj)(); // 结果请看上述注释 foo的this被绑定到obj,注意是foo作用域内的this指向obj,返回函数的this为window
</script>
<script>
console.log("--------------------------");
function foo2() {
var self = this;
console.log(this.a); // 3
setTimeout(function () {
var a = 4;
/*
下面这行代码里面的的a,表示的是对变量的调用,如果说匿名函数没有声明var a = 4;或匿名函数没有带形参,
又或上层作用域foo2中没有形参及变量声明、最外层没有声明的话,则就是报错,
而不是undefined:Uncaught ReferenceError: a is not defined
有形参则是undefined。
换句话说console.log(a)中就是去查找变量a啊,如果层层查找没有发现形参,也没有声明,那肯定是报错的啊。
*/
console.log("形参:" + a); // 形参:4
console.log("对象属性:" + this.a); // 对象属性:undefined
}, 100);
var self = this;
setTimeout(function () {
console.log(self.a); // 3 临时变量self将外部this值导入到内部函数。
}, 100);
}
var obj2 = { a: 3 };
foo2.call(obj2);
// 2
// undefined
// -----------------------
// 3
// 形参:4
// 对象属性:undefined
// 3
</script>