亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于apply里arguments的問題

關于apply里arguments的問題

蠱毒傳說 2018-10-09 13:37:29
var singleton = function(fn) {    var result;    return function() {        return result || (result = fn.apply(this, arguments));  //關于這里的代碼     } }var createMask = singleton(    function() {        return document.body.appendChild(document.createElement('div'));     } )關于這句代碼:fn.apply(this, arguments)fn是后面創建div的函數吧,這里的apply是什么作用?特別是arguments指向什么呀?他作用是讓this指向函數本身的this嗎?
查看完整描述

1 回答

?
Helenr

TA貢獻1780條經驗 獲得超4個贊

看了半天才理解。

這是一個單例模式的例子,讓我們來分解代碼解釋一下

singleton是一個單一實例類。當result不為空時,直接返回result,讓結果為空時,返回fn的執行結果,并且賦值到result以備下次可以直接返回result而不用再執行fn

沒看出里面的apply有什么用,調試了一下,看到arguments是一個空數組,這是一個js自帶變量,表示當前函數接收到的參數數組,這里沒有傳參數進來,理所當然是空數組一個。

var singleton = function(fn) {    var result;    return function() {        return result || (result = fn()); //關于這里的代碼
    }
}var createMask = singleton(    function() {        return document.body.appendChild(document.createElement('div'));
    }
)

代碼改成這樣仍然能正確的做好單例模式。


我們再來看createMask

https://img1.sycdn.imooc.com//5bed01250001c24a06380096.jpg

我們看到createMask是一個函數。

https://img1.sycdn.imooc.com//5bed012b0001b7d409490346.jpg

這個函數里面能訪問到我們從

singleton(    function() {        return document.body.appendChild(document.createElement('div'));
    }
)

傳進去的回調函數,也就是fn,也能訪問到singleton里面的result變量。那么,createMask函數就能實現根據單例變量'result'是否有值,來決定是否調用fn產生一個result值

綜上所述,你不應該關注apply和arguments,它們只是一個簡單的函數調用代理而已。 你應該關心的是:
1 這幾行代碼實現的單例模式的精巧結構
2.它為什么這樣設計?是否有別的更直觀的寫法實現同樣的功能?


查看完整回答
反對 回復 2018-11-15
  • 1 回答
  • 0 關注
  • 906 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號