先看代码
const xiaoming = {
name: '小明',
own: '铅笔',
zhuanbidao: function(result1, result2){console.log(`${this.name}使用了转笔刀把${this.own}变成了${result1}和${result2}`)}
}
上述代码很简单,小明有一只铅笔,有一把转笔刀,可以用来削铅笔,当我们调用
xiaoming.zhuanbidao('削好的铅笔', '木屑');
很明显会得到:小明使用了转笔刀把铅笔变成了削好的铅笔和木屑
此时有个问题,小明的同桌小华也有一只铅笔,但是没有转笔刀,但是他也需要削铅笔,咋办呢?
const xiaohua = { name: '小华', own: '铅笔' };
直接调用
xiaohua.zhuanbidao('削好的小华的铅笔', '小华铅笔的木屑'); // 肯定报错
此时,小华可以叫一下小明:‘小明哥,借个转笔刀使使呗’,于是便有了
xiaoming.zhuanbidao.call(xiaohua, '削好的小华的铅笔', '小华铅笔的木屑');
// 小华使用了转笔刀把铅笔变成了削好的小华的铅笔和小华铅笔的木屑
从上述示例不难理解,小明和小华都有各自的铅笔,这个铅笔可以看作this,但是小明自己有转笔刀,可以直接削自己的铅笔,但是小华没有,他只有自己的铅笔,于是他需要借小明的转笔刀来削自己的铅笔(this指向改变,变成了小华自己的铅笔),也一样可以得到自己削好的铅笔。
最后至于call和apply的区别就只是传参的方式不同而已
xiaoming.zhuanbidao.apply(xiaohua, ['削好的小华的铅笔', '小华铅笔的木屑']);
bind可以看作只是和小明借到了转笔刀,但是还没有开始削,要削怎么办?调用一下方法咯;传参和call一样
xiaoming.zhuanbidao.bind(xiaohua, '削好的小华的铅笔', '小华铅笔的木屑')();
ok that's all
JavaScript中有很多令人困惑的地方,或者叫做机制。但是,就是这些东西让JavaScript显得那么美好而与众不同。比方说函数也是对象、闭包、原型链继承等等,而这其中就包括颇让人费解的this机制。
this的绑定过程之前的调用栈 和 调用位置,this绑定规则:1、默认模式,2、隐式绑定,3、显式绑定,4、new绑定
在 JavaScript 中,this 这个特殊的变量是相对比较复杂的,因为 this 不仅仅用在面向对象环境中,在其他任何地方也是可用的。 本篇博文中会解释 this 是如何工作的以及使用中可能导致问题的地方,最后奉上最佳实践。
this关键字在js中的指向问题不管是工作还是面试中都会经常遇到,所以在此对它进行一下总结:全局作用域中、闭包中指window、函数调用模式:谁调用就指谁、构造函数中,this指实例对象、apply/call改变this的指向、bind改变this指向等
如果这很难明白,为什么我们不停止使用它呢?认真的思考一下?如果你读过 将90%的垃圾扔进垃圾桶后,我如何重新发现对JavaScript的爱, 当我说扔掉它时,你不会感到惊讶,this被丢弃了
this的用法:直接在函数中使用 谁调用这个函数this就指向谁 ,对象中使用, 一般情况下指向该对象 ,在构造函数中使用
this的四种绑定策略:默认绑定、隐式绑定、显示绑定、new绑定。首先要明确的是一般情况下,this不是函数被定义时绑定,而是函数被调用时被绑定 ,那么函数中的this有四种绑定方式:
this是Javascript语言的一个关键字。它代表函数运行时,自动生成的一个内部对象.this永远指向函数的调用者。随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。
apply和call的区别就是传的参数形式不一样。call是一个一个的传,apply可以将参数以数组的形式传进去。而bind是传入第二个和后面的参数,且绑定this,返回一个转化后的函数。
以函数形式调用,this指向window;以方法形式调用,this指向调用方法的那个对象;构造函数调用,this指向实例的对象;使用window对象的方法使,指向window;多重场景改变this指向
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!