JS中的this指向_js this_Armin444的博客-CSDN博客
严格模式和非严格模式区别_weixin_33797791的博客-CSDN博客
目录
概念:
不同情景下的this指向:
一、全局环境下的this:
二、函数里的this:
1、普通函数:
2、箭头函数:
3、构造函数:
三、对象里里里的this:最外层对象本身的指向是window
四、原型链的this:
改变this指向的方法:
先上一道面试题:
var x = 1;
var obj = {
x: 3,
fun: function () {
var x = 5;
return this.x;
}
}
var fun = obj.fun;
console.log(obj.fun(), fun());
//打印结果:3 1
1、this是一个指针型变量,它动态指向当前函数的运行环境。
2、在不同的场景中调用同一个函数,this的指向也可能会发生变化,但是它永远指向其所在函数的真实调用者;如果没有调用者,就指向全局对象window。
普通函数:关于this,谁调用就指向谁;没有调用者,就指向全局对象window。
箭头函数:箭头函数的this指向于函数作用域所用的对象。
在全局作用域下,this始终指向全局对象window,无论是否是严格模式!
a.严格模式:
在严格模式下, 我们对代码的的调用必须严格的写出被调用的函数的对象,不可以有省略或者说简写。
function test() {
'use strict'
console.log(this)
}
test();
window.test();
//打印结果: undefined window
b.非严格模式:
function test() {
console.log(this)
}
test();
window.test();
//打印结果: window window
箭头函数的重要特征:箭头函数中没有this和arguments,是真的没有!
箭头函数没有自己的this指向,它会捕获自己定义所处的外层执行环境,并且继承这个this值,指向当前定义时所在的对象。箭头函数的this指向在被定义的时候就确定了,之后永远都不会改变。即使使用call()、apply()、bind()等方法改变this指向也不可以。
如果父级作用域还是箭头函数,就再往上找,一层一层的直到直到this的指向。
var y = 9;
var show = () => {
var y = 8;
console.log(this.y)
};
var obj = {
y: 88,
num: this.y,
watch: () => {
console.log(this.y)
}
};
show();
window.show();
obj.watch();
window.obj.watch();
console.log(obj.num);
//打印结果: 9 9 9 9 9
//由于show函数是箭头函数,所以自身不能绑定this,因此找它的上一级作用域。
//window.show()返回值是window,所以this此时指向window;
//window.obj.show(),obj是对象,非箭头函数,所以找到这里就停止了,
//this绑定到obj上。window调用obj,所以obj中的this也指向window。
构造函数中的this指向构造函数下创建的实例。
var obj = {
name: 'yuan',
address: 'chengdu'
}
function Cat(name, address) {
this.name = name;
this.address = address;
}
var SongGuo = new Cat('song', 'beijing');
console.log(SongGuo.name);
console.log(SongGuo.address);
//打印结果: song beijing
对象内部方法的this指向调用这些方法的对象,也就是谁调用就指向谁
1、一层对象和两层对象一起比较:
var x = 1;
var obj = {
x: 3,
fun: function () {
var x = 5;
console.log(this.x);
},
obj2: {
x: 33,
fun2: function () {
var x = 55;
console.log(this.x);
}
}
}
obj.fun();
obj.obj2.fun2();
//打印结果:3 33
总结:
a、函数的定义位置不影响其this指向,this指向只和调用函数的对象有关。
b、多层嵌套的对象,内部方法的this指向离被调用函数最近的对象。
this这个值在一个继承机制中,仍然是指向它原本属于的对象,而不是从原型链上找到它时,它所属于的对象。
call()、apply()、bind()等;
见:JS中的this指向_js this_Armin444的博客-CSDN博客