文章目录
this的语法理解
this在英文中是一个指示代词,表示 这;这个
顾名思义,在编程于语言里,this就是一个指代作用。
我在人民广场吃着炸鸡
小明也在人民广场吃着炸鸡
人民广场还有跳广场舞的阿姨
还有三只小猫在人民广场睡觉
这样表达没毛病,但是太过繁琐,如果把重复的人民广场用 这 来代替,就会变成:
我在人民广场吃着炸鸡
小明也在这吃着炸鸡
这还有跳广场舞的阿姨
还有三只小猫在这睡觉
如果在写代码的时候, 太多对象名字重复使用,会使代码看起来繁琐,不简洁,乱等等,我们就可以使用this来解决这个问题。接下来具体看看this究竟有些什么语法,以及怎么用?
一、this的绑定方式
1.默认绑定
function fn(){ console.log(this); } fn()
我们可以看到,函数在全局调用的时候,this默认指向window对象
2.隐式绑定
var obj ={ name:'亚索', age:'20岁', height:'185cm', weight:'150斤', ziliao:function(){ console.log('姓名:'+ this.name); console.log('年龄:'+ this.age); console.log('身高:'+ this.height); console.log('体重:'+ obj.weight); } } obj.ziliao()
我们通过上面这个例子可以看到,当我们调用一个对象的方法时,就会出现隐式绑定,this会指向对象。如果不用this,也可以把this换成obj,是一样的,只不过this更方便。此时this指向当前对象,翻译为这个名字,这个年龄,这个身高,这个体重。
3.显式绑定
var lol = { name:'阿卡丽', whatName:function(){ console.log('我最爱的英雄是'+this.name); } } var hero1 ={ name:'卡特琳娜' } var hero2 ={ name:'卢锡安' } lol.whatName.apply(hero1) lol.whatName.apply(hero2) lol.whatName.call(hero1) lol.whatName.call(hero2)
这种方法可以指定this的绑定对象。call()与apply()的效果是完全相同的
4.构造函数绑定
function People(name) { this.name = name; this.favour = function() { console.log('我最喜欢的英雄是' + this.name); } } var name = '卡特琳娜' var Lovename = new People('阿卡丽') Lovename.favour();
当我们new一个构造函数,得到的这个实例,它继承了构造器的构造属性以及原型上的属性。
5.箭头函数绑定
其实箭头函数是没有this的,如果想在箭头函数中用this。那么一定要把箭头函数嵌套在一个作用域内部,箭头函数的this指向取决于外层作用域中的this,外层作用域或函数的this指向谁,箭头函数中的this就指向谁。这有点继承的意思,但更重要的是,箭头函数本身没有this,如果绑定成功,则没有办法修改。
二、两个细节
1.严格模式
严格模式即'use strict'
严格模式下,规定禁止this关键字指向全局对象window,此时this会绑定到undefined
function fn(){
'use strict'
console.log(this);
}
fn() //打印结果为undefined
// 'use strict' 是一种声明关键词,告诉浏览器,此时是严格模式。
2.如何更改this指向
一般的,我们常用call(),apply()方法来更改this指向
首先call(),apply()是函数自带的方法,在调用函数时,可以改变this指向。这一点在显示绑定里,有了详细的说明。
call方法接受的是一个实参列表,第一个实参指向this,其余实参赋给形参进入函数。
语法:
fn.call(this,参数2,参数3,参数4)
apply方法接受的是一个实参列表,第一个实参指向this,其余实参会在一个数组里,以数组为参数的形式赋值给形参进行传参
语法:
fn.apply(this,[参数2,参数3,参数4])
还有一个方法就是bind(),但是意义不大,有兴趣可以去MDN官网查看。
总结
1.this可用可不用,不用代码也能敲,需求也能实现,但用了方便
2.this常见的绑定方式,有默认绑定,隐式绑定,显式绑定,构造函数绑定,箭头函数绑定
3.严格模式下,规定this指向undefined
4.更改this指向的方法,常用call(),apply()