Seorang rakan sekerja terperangkap pada bug
dan vue2的this指向问题
kerana masalah yang ditunjukkan oleh ini, dia menggunakan fungsi anak panah, mengakibatkan kegagalan untuk mendapatkan props
yang sepadan. Dia tidak tahu apabila saya memperkenalkannya kepadanya, dan kemudian saya sengaja melihat kumpulan pertukaran bahagian hadapan Setakat ini, sekurang-kurangnya 70% pengaturcara bahagian hadapan masih tidak memahaminya anda penunjuk this
Jika saya tidak belajar apa-apa, sila berikan saya mulut yang besar.
this
menunjuk kepada Ia tiada kaitan dengan tempat ia ditakrifkan, ia bergantung pada cara memanggilnya dan dalam bentuk apa this
(ini) Bagaimana fungsi ini dipanggil (untuk memudahkan ingatan) Kami memperkenalkan di atas bahawa penunjuk this
terutamanya berkaitan dengan bentuk panggilan. Seterusnya, saya akan memperkenalkan peraturan panggilan kepada anda Tanpa peraturan, tidak ada yang lengkap.
function bar() { console.log(this) // window }
window
this
undefined
const info = { fullName: 'ice', getName: function() { console.log(this.fullName) } } info.getName() // 'ice'
info
ialah this
, dan melalui info
tiada keraguan bahawa nilai akses ialah this.fullName
ice
Biasa
hilang secara tersirat. Dalam kes ini, kehilangan tersirat akan dilakukan Fungsi terikat secara tersirat akan kehilangan objek pengikat, yang bermaksud ia menjadi nilai pengikatan lalai > atau Bergantung pada persekitaran anda sekarang, sama ada dalam mod ketat. this
window
undefined
Dalam kes ini, kehilangan tersirat dilakukan dan objek terikat hilang Mengapa masalah sedemikian berlaku? Jika anda biasa dengan ingatan, ia akan mudah difahami.
const info = { fullName: 'ice', getName: function() { console.log(this.fullName) } } const fn = info.getName fn() //undefined
tidak dipanggil terus di sini, tetapi alamat memori yang sepadan dengan
ditemui melaluiinfo
getName
dan kemudian terus melalui fn
Sebenarnya, intipati di sini adalah untuk memanggil fungsi bebas, iaitu fn
dan ia mestilah window
window
fullName
Tersirat. Loss Advancedundefined
Pertama sekali,
dalam
//申明变量关键字必须为var var fullName = 'panpan' const info = { fullName: 'ice', getName: function() { console.log(this.fullName) } } function bar(fn) { //fn = info.getName fn() // panpan } bar(info.getName)
bar
rujukan, iaitu, alamat memori mereka fn
fn = info.getName
ialah global fn = info.getName
objek this
? this
window
Kerana hanya pembolehubah yang diisytiharkan oleh var
var
window
letconst
Fungsi "Semua" dalam js mempunyai beberapa ciri berguna Ini berkaitan dengan rantaian prototaipnya memperkenalkan dalam prototaip kaedah melaksanakan pewarisan dalam bentuk terselindung dalam js melalui rantai prototaip Antaranya, this
tiga kaedah ini ialah kaedah pada rantai prototaip fungsi, dan ia boleh dipanggil dalam fungsi.
call()
方法使用一个指定的 this
值和单独给出的一个或多个参数来调用一个函数。this
对象apply()
方法类似,只有一个区别,就是 call()
方法接受的是一个参数列表,而 apply()
方法接受的是一个包含多个参数的数组。var fullName = 'panpan' const info = { fullName: 'ice', getName: function(age, height) { console.log(this.fullName, age, height) } } function bar(fn) { fn.call(info, 20, 1.88) //ice 20 1.88 } bar(info.getName)
call
的方法类似,只是参数列表有所不同call
参数为单个传递apply
参数为数组传递var fullName = 'panpan' const info = { fullName: 'ice', getName: function(age, height) { console.log(this.fullName, age, height) } } function bar(fn) { fn.apply(info, [20, 1.88]) //ice 20 1.88 } bar(info.getName)
bind
与apply/call
之间有所不同,bind
传入this
,则是返回一个this
绑定后的函数,调用返回后的函数,就可以拿到期望的this。bind
时,可以传入参数bind
返回的参数也可以进行传参var fullName = 'panpan' const info = { fullName: 'ice', getName: function(age, height) { console.log(this.fullName, age, height) //ice 20 1.88 } } function bar(fn) { let newFn = fn.bind(info, 20) newFn(1.88) } bar(info.getName)
谈到new
关键字,就不得不谈构造函数,也就是JS中的 "类",后续原型篇章在跟大家继续探讨这个new关键字,首先要明白以下几点,new Fn()
的时候发生了什么,有利于我们理解this
的指向。
创建了一个空对象
将this指向所创建出来的对象
把这个对象的[[prototype]] 指向了构造函数的prototype属性
执行代码块代码
如果没有明确返回一个非空对象,那么返回的对象就是这个创建出来的对象
function Person(name, age) { this.name = name this.age = age } const p1 = new Person('ice', 20) console.log(p1) // {name:'ice', age:20}
new Person()
的时候,那个this所指向的其实就是p1
对象function bar() { console.log(this) //info } const info = { bar: bar } info.bar()
widonw或者undefined
,变相的可以认为隐式绑定 > 默认绑定var fullName = 'global ice' const info = { fullName: 'ice', getName: function() { console.log(this.fullName) } } info.getName.call(this) //global ice info.getName.apply(this) //global ice info.getName.bind(this)() //global ice
function bar() { console.log(this) //123 } const newFn = bar.bind(123) newFn.call(456)
首先我们来说一下,为什么是和bind
比较,而不能对call
和apply
比较,思考下面代码
const info = { height: 1.88 } function Person(name, age) { this.name = name this.age = age } const p1 = new Person.call('ice', 20) //报错: Uncaught TypeError: Person.call is not a constructor
new绑定和bind绑定比较
const info = { height: 1.88 } function Person(name, age) { this.name = name this.age = age } const hasBindPerson = Person.bind(info) const p1 = new hasBindPerson('ice', 20) console.log(info) //{height: 1.88}
bind
对Person
进行了一次劫持,硬绑定了this为info
对象new
返回的固定this的函数new关键字
> bind
> apply/call
> 隐式绑定
> 默认绑定
首先箭头函数是ES6
新增的语法
const foo = () => {}
var fullName = 'global ice' const info = { fullName: 'ice', getName: () => { console.log(this.fullName) } } info.getName() //global ice
ice
ES6
的新特性,箭头函数不绑定this
,它的this
是上一层作用域,上一层作用域为window
global ice
getObjName
通过this
拿到info
中的fullName
(值为ice
的fullName
)const info = { fullName: 'ice', getName: function() { let _this = this return { fullName: 'panpan', getObjName: function() { console.log(this) // obj console.log(_this.fullName) } } } } const obj = info.getName() obj.getObjName()
当我调用 info.getName()
返回了一个新对象
当我调用返回对象的getObjName
方法时,我想拿到最外层的fullName
,我通过,getObjName
的this访问,拿到的this却是obj
,不是我想要的结果
我需要在调用info.getName()
把this保存下来,info.getName()
是通过隐式调用,所以它内部的this就是info对象
getObjName
是obj对象,因为也是隐式绑定,this必定是obj对象,绕了一大圈我只是想拿到上层作用域的this而已,恰好箭头函数解决了这一问题
const info = { fullName: 'ice', getName: function() { return { fullName: 'panpan', getObjName: () => { console.log(this.fullName) } } } } const obj = info.getName() obj.getObjName()
默认绑定
隐式绑定
显示绑定 apply/call/bind(也称硬绑定)
new绑定
new绑定
bind
call/apply
隐式绑定
默认绑定
当一切都看起来不起作用的时候,我就会像个石匠一样去敲打石头,可能敲100次,石头没有任何反应,但是101次,石头可能就会裂为两半 我知道并不是第101次起了作用,而是前面积累所致。
大家有疑惑可以在评论区留言 第一时间为大家解答。
(学习视频分享:web前端开发)