<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JS中this、apply、call、bind的相關介紹

        來源:懂視網 責編:小OO 時間:2020-11-27 20:13:03
        文檔

        JS中this、apply、call、bind的相關介紹

        這又是一個面試經典問題~/(ㄒoㄒ)/~~也是 ES5中眾多坑中的一個,在 ES6 中可能會極大避免 this 產生的錯誤,但是為了一些老代碼的維護,最好還是了解一下 this 的指向和 call、apply、bind 三者的區別。this 的指向;在 ES5 中,其實 this 的指向,始終堅持一個原理:this 永遠指向最后調用它的那個對象,來,跟著我朗讀三遍:this 永遠指向最后調用它的那個對象,this 永遠指向最后調用它的那個對象,this 永遠指向最后調用它的那個對象。記住這句話,this 你已經了解一半了。下面我們來看一個最簡單的例子。例 1。;
        推薦度:
        導讀這又是一個面試經典問題~/(ㄒoㄒ)/~~也是 ES5中眾多坑中的一個,在 ES6 中可能會極大避免 this 產生的錯誤,但是為了一些老代碼的維護,最好還是了解一下 this 的指向和 call、apply、bind 三者的區別。this 的指向;在 ES5 中,其實 this 的指向,始終堅持一個原理:this 永遠指向最后調用它的那個對象,來,跟著我朗讀三遍:this 永遠指向最后調用它的那個對象,this 永遠指向最后調用它的那個對象,this 永遠指向最后調用它的那個對象。記住這句話,this 你已經了解一半了。下面我們來看一個最簡單的例子。例 1。;

        JS中的this、apply、call、bind是一道經典面試題,最好還是了解一下 this 的指向和 call、apply、bind 三者的區別。下面就跟隨腳本之家小編一起學習this、apply、call、bind的知識吧

        這又是一個面試經典問題~/(ㄒoㄒ)/~~也是 ES5中眾多坑中的一個,在 ES6 中可能會極大避免 this 產生的錯誤,但是為了一些老代碼的維護,最好還是了解一下 this 的指向和 call、apply、bind 三者的區別。

        this 的指向

        在 ES5 中,其實 this 的指向,始終堅持一個原理:this 永遠指向最后調用它的那個對象,來,跟著我朗讀三遍:this 永遠指向最后調用它的那個對象,this 永遠指向最后調用它的那個對象,this 永遠指向最后調用它的那個對象。記住這句話,this 你已經了解一半了。

        下面我們來看一個最簡單的例子:

        例 1:

        這個相信大家都知道為什么 log 的是 windowsName,因為根據剛剛的那句話“this 永遠指向最后調用它的那個對象”,我們看最后調用 a 的地方 a();,前面沒有調用的對象那么就是全局對象 window,這就相當于是 window.a();注意,這里我們沒有使用嚴格模式,如果使用嚴格模式的話,全局對象就是 undefined,那么就會報錯 Uncaught TypeError: Cannot read property 'name' of undefined。

        再看下這個例子:

        例 2:

        在這個例子中,函數 fn 是對象 a 調用的,所以打印的值就是 a 中的 name 的值。是不是有一點清晰了呢~

        我們做一個小小的改動:

        例 3:

        這里打印 Cherry 的原因也是因為剛剛那句話“this 永遠指向最后調用它的那個對象”,最后調用它的對象仍然是對象 a。

        我們再來看一下這個例子:

        例 4:

        這里為什么會打印 undefined 呢?這是因為正如剛剛所描述的那樣,調用 fn 的是 a 對象,也就是說 fn 的內部的 this 是對象 a,而對象 a 中并沒有對 name 進行定義,所以 log 的 this.name 的值是 undefined。

        這個例子還是說明了:this 永遠指向最后調用它的那個對象,因為最后調用 fn 的對象是 a,所以就算 a 中沒有 name 這個屬性,也不會繼續向上一個對象尋找 this.name,而是直接輸出 undefined。

        再來看一個比較坑的例子:

        例 5:

        這里你可能會有疑問,為什么不是 Cherry,這是因為雖然將 a 對象的 fn 方法賦值給變量 f 了,但是沒有調用,再接著跟我念這一句話:“this 永遠指向最后調用它的那個對象”,由于剛剛的 f 并沒有調用,所以 fn() 最后仍然是被 window 調用的。所以 this 指向的也就是 window。

        由以上五個例子我們可以看出,this 的指向并不是在創建的時候就可以確定的,在 es5 中,永遠是this 永遠指向最后調用它的那個對象。

        再來看一個例子:

        例 6:

        讀到現在了應該能夠理解這是為什么了吧(o?▽?)o。

        怎么改變 this 的指向

        改變 this 的指向我總結有以下幾種方法:

        使用 ES6 的箭頭函數

        在函數內部使用 _this = this

        使用 apply、call、bind

        new 實例化一個對象

        例 7:

        在不使用箭頭函數的情況下,是會報錯的,因為最后調用 setTimeout 的對象是 window,但是在 window 中并沒有 func1 函數。

        我們在改變 this 指向這一節將把這個例子作為 demo 進行改造。

        箭頭函數

        眾所周知,ES6 的箭頭函數是可以避免 ES5 中使用 this 的坑的。箭頭函數的 this 始終指向函數定義時的 this,而非執行時。,箭頭函數需要記著這句話:“箭頭函數中沒有 this 綁定,必須通過查找作用域鏈來決定其值,如果箭頭函數被非箭頭函數包含,則 this 綁定的是最近一層非箭頭函數的 this,否則,this 為 undefined”。

        例 8 :

        在函數內部使用 _this = this

        如果不使用 ES6,那么這種方式應該是最簡單的不會出錯的方式了,我們是先將調用這個函數的對象保存在變量 _this 中,然后在函數中都使用這個 _this,這樣 _this 就不會改變了。

        例 9:

        這個例子中,在 func2 中,首先設置 var _this = this;,這里的 this 是調用 func2 的對象 a,為了防止在 func2 中的 setTimeout 被 window 調用而導致的在 setTimeout 中的 this 為 window。我們將 this(指向變量 a) 賦值給一個變量 _this,這樣,在 func2 中我們使用 _this 就是指向對象 a 了。

        使用 apply、call、bind

        使用 apply、call、bind 函數也是可以改變 this 的指向的,原理稍后再講,我們先來看一下是怎么實現的:

        使用 apply

        例 10:

        使用 call

        例 11:

        使用 bind

        例 12:

        apply、call、bind 區別

        剛剛我們已經介紹了 apply、call、bind 都是可以改變 this 的指向的,但是這三個函數稍有不同。

        在 MDN 中定義 apply 如下;

        apply() 方法調用一個函數, 其具有一個指定的this值,以及作為一個數組(或類似數組的對象)提供的參數

        語法:

        thisArg:在 fun 函數運行時指定的 this 值。需要注意的是,指定的 this 值并不一定是該函數執行時真正的 this 值,如果這個函數處于非嚴格模式下,則指定為 null 或 undefined 時會自動指向全局對象(瀏覽器中就是window對象),同時值為原始值(數字,字符串,布爾值)的 this 會指向該原始值的自動包裝對象。

        argsArray:一個數組或者類數組對象,其中的數組元素將作為單獨的參數傳給 fun 函數。如果該參數的值為null 或 undefined,則表示不需要傳入任何參數。從ECMAScript 5 開始可以使用類數組對象。瀏覽器兼容性請參閱本文底部內容。

        apply 和 call 的區別

        其實 apply 和 call 基本類似,他們的區別只是傳入的參數不同。

        call 的語法為:

        所以 apply 和 call 的區別是 call 方法接受的是若干個參數列表,而 apply 接收的是一個包含多個參數的數組。

        例 13:

        例 14:

        bind 和 apply、call 區別

        我們先來將剛剛的例子使用 bind 試一下

        我們會發現并沒有輸出,這是為什么呢,我們來看一下 MDN 上的文檔說明:

        bind()方法創建一個新的函數, 當被調用時,將其this關鍵字設置為提供的值,在調用新函數時,在任何提供之前提供一個給定的參數序列。

        所以我們可以看出,bind 是創建一個新的函數,我們必須要手動去調用:

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JS中this、apply、call、bind的相關介紹

        這又是一個面試經典問題~/(ㄒoㄒ)/~~也是 ES5中眾多坑中的一個,在 ES6 中可能會極大避免 this 產生的錯誤,但是為了一些老代碼的維護,最好還是了解一下 this 的指向和 call、apply、bind 三者的區別。this 的指向;在 ES5 中,其實 this 的指向,始終堅持一個原理:this 永遠指向最后調用它的那個對象,來,跟著我朗讀三遍:this 永遠指向最后調用它的那個對象,this 永遠指向最后調用它的那個對象,this 永遠指向最后調用它的那個對象。記住這句話,this 你已經了解一半了。下面我們來看一個最簡單的例子。例 1。;
        推薦度:
        標簽: call js 相關
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 区三区激情福利综合中文字幕在线一区亚洲视频1 | 黄色网址免费在线| 成年美女黄网站18禁免费| 亚洲国产午夜电影在线入口| 久久久精品2019免费观看| 亚洲国产女人aaa毛片在线 | 久久精品无码专区免费东京热| 亚洲日本乱码在线观看| 国产在线精品免费aaa片| 久热综合在线亚洲精品| 在免费jizzjizz在线播| 亚洲专区一路线二| 日韩毛片无码永久免费看| 曰批免费视频播放在线看片二| 全亚洲最新黄色特级网站| 久青草视频97国内免费影视| 亚洲AV无码一区东京热久久| 亚洲免费观看网站| 亚洲国产成人久久综合| 亚洲无线一二三四区手机| 国产情侣久久久久aⅴ免费| 亚洲精品mv在线观看| 免费看美女被靠到爽| 中国好声音第二季免费播放| 亚洲黄色免费电影| 免费看片免费播放| 国产精品免费久久久久久久久| 亚洲AV无码精品无码麻豆| 一二三四视频在线观看中文版免费| 亚洲精品理论电影在线观看| 国产精品亚洲玖玖玖在线观看| 最新久久免费视频| 国产精品亚洲自在线播放页码| 又爽又黄无遮挡高清免费视频| 国产一区二区免费视频| 亚洲欧美日本韩国| 久久91亚洲人成电影网站| 最新仑乱免费视频| 两个人看的www免费视频| 亚洲精品无码少妇30P| 亚洲色婷婷综合久久|