JAVAscript中的this指向和this指向的修改
this 關鍵字
- 一般在函式中使用,表示哪個物件執行了當前函式,
- 每一個函式內部都有一個關鍵字是
this, - 函式內部的 this 只和函式的呼叫方式有關系,和函式的定義方式沒有關系
- 函式內部的 this 指向誰,取決于函式的呼叫方式,
window
- JS中的頂層物件,所有的全域都屬于
window,
物件(Object)
- 資料型別,描述了事物,可以有屬性,可以有函式;如有函式,在執行了這個函式后,this才是當前物件,
函式
- 是載體,或作用域,其中的this表示當前函式在執行是的所屬物件,
this指向
- 默認情況下,this是當前所在函式的執行物件,
- 沒有明確隸屬物件的函式,被直接執行,一般都是
window, - 有所屬兌現的函式,被執行,一般都是當前函式的所屬物件(
隱式系結this), - 不管這個函式是誰的,有沒有所屬物件,只要作為引數傳遞,通過引數執行這個函式,一般情況下都是
window:(隱式丟失), new系結:函式被執行后,函式內部的this會指向new出來的實體,- 箭頭函式、定時器、延時器內部沒有
this,箭頭函式的this是背景關系的 this, 注意:不是所有回呼函式中的this都指向window---某些特殊情況下被系統修改,
修改this的指向
修改this指向的規則
this的內容必須是物件,如果不是強行轉成物件,但依然符合之前資料型別的使用規則,
為什么修改this指向
- 修正,
- 繼承:利用this的指向,借用別的物件的方法,
方法
call方法
- 引數:一個或多個
①:一個引數:第一個引數是修改后this的指向,
②:多個引數:其他所有引數表示向函式中正常傳參, - 功能:修改原函式的this指向,
切記:僅僅是在當前qpply執行的時候修改了, - 回傳值:是原函式的回傳值,沒有修改原函式,
- 會立即執行函式,
var obj = { name: 'Jack' }
function fn(a, b) {
console.log(this)
console.log(a)
console.log(b)
}
fn(1, 2)
fn.call(obj, 1, 2)//此時this指向obj
apply方法
- 引數:
①一個引數:第一個引數是修改之后this的指向,
②二個引數:第二個引數是一個陣列,這個陣列中所有的資料,被自動展開之后,傳入原函式,可以省略, - 功能:修改原函式的this指向
切記:僅僅是在當前qpply執行的時候修改了, - 回傳值:原函式的回傳值,沒有修改原函式,
- 會立即執行函式,
var obj = { name: 'Jack' }
function fn(a, b) {
console.log(this)
console.log(a)
console.log(b)
}
fn(1, 2)
fn.apply(obj, [1, 2])//此時this指向obj
bind方法
- 引數:
①第一個引數:修改之后的this指向,
②多個引數:后面所有的引數都是向函式中正常傳遞的實參,可以省略,也可以傳多個, - 功能:修改this的指向,
切記:僅僅是在當前qpply執行的時候修改了, - 回傳值:修改了this之后的新函式,沒有修改原函式,
var obj = { name: 'Jack' }
function fn(a, b) {
console.log(this)
console.log(a)
console.log(b)
}
fn(1, 2)
var newFn = fn.bind(obj)//此時this的指向已經修改
// fn.bind(obj,1,2)()|| fn.bind(obj)(1,2)||newFn(1, 2)這三種方式都能執行bing方法修改this指向后的函式
方法的區別
- call和apply的區別是第一個引數以后的引數,
- call與apply和bind的區別:
①call和apply會自動執行,執行之后的回傳值時原函式的回傳值,
②bind執行之后,會得到一個新函式,如果需要,新函式需要手動執行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/274079.html
標籤:其他
