现在使用的框架是vue2,使用最多的就是this,现在谈下this指向的问题,开发过程中也经常会碰到通过this拿不到值的问题,现在记录一下,常见的共有6种情况,严格模式指向undefined
1:函数自调用:this指向window
function fn(){
console.log(this);
}
fn()//window
window.name = '老王'
var obj = {
name: "隔壁老王",
getThis: function () {
console.log(this);
console.log(this.name);
}
}
var getNew = obj.getThis
getNew()//老王:这里的函数赋值给getNew,getNew自调用,指向的是window
2:对象里面的方法调用指向这个对象
var obj={
name:"this",
getThis:function(){
console.log(this); //打印的obj这个对象
console.log(this===obj);//true
}
}
obj.getThis()//{name: 'this'} true
3:箭头函数里面的this指向箭头函数外层的this
function fn1() {
console.log(this, 'fn1');
let fn2 = () => {
console.log(this, 'fn2');
}
fn2() //因为fn1自调用指向window,所以fn2 的this也是window
}
fn1()//fn1:wiodow,fn2:window
4:new关键字调用函数,this指向的是这个新对象
function fn(name){
console.log(this,'999');//fn{},'999',这里的this指向的是fn构造函数
this.name=name
}
var fn1=new fn('小明')
console.log(fn1.name);//'小明'
5:js的call(),apply(),bind()原生方法,this指向的是这些方法的第一个参数
//call
call(name1,arg2,argsn)//第一个参数永远是将要this重指向的对象,2-n个参数是参数列表,用 ,分割
var obj = { name: "老王", age: 27 }
var obj1 = { name: '隔壁老王', age: 30 }
function fn(age) {
console.log(this.name, this.age);
}
fn.call(obj) //老王,27
fn.call(obj1)//隔壁老王,30
var obj=function(name,age){
console.log(this);
console.log(name);
console.log(age);
}
obj.call(window,'老王','18','22',33)//window,老王,18
//apply
apply(nama,[args,arg1,args2])//第一个参数永远是将要this重指向的对象,第二个参数为数组格式的
var obj = { name: "老王", age: 27 }
var obj1 = { name: '隔壁老王', age: 30 }
function fn(age) {
console.log(this.name, this.age);
}
// fn.apply(obj) //老王,27
// fn.apply(obj1)//隔壁老王,30
var obj3=function(name,age){
console.log(this); //{ name: "老王", age: 27 },这里因为apply强制指向obj了
console.log(name);//吃西瓜
console.log(age);//20
}
obj3.apply(obj,['吃西瓜',20,90])
//bind()
var obj = {
name: "老王",
fn: function () {
console.log(this, 'obj.fn');
}
}
var obj1=obj.fn.bind({name:'隔壁老王'})
// obj1()this指向的是{ name: '隔壁老王' }
var obj={name:'bind'}
function fn(str){
console.log(this,str);
}
var fn1=fn.bind(obj,'parms')
fn1()//this指向obj,parms作为fn的参数,打印结果:{name: 'bind'} 'parms'
var obj = { name: 'bind' }
function fn(str) {
console.log(this, str);
console.log(arguments);
}
var f = fn.bind(obj, 'aa')
f() //{name: 'bind'} 'aa' Arguments ['aa']
f('gg', '1', 2, 4) //{name: 'bind'} 'aa' Arguments ['aa','gg', '1', 2, 4]
6:计时器,延时器:this指向的是window