1. 程式人生 > 程式設計 >JS typeof fn === 'function' && fn()詳解

JS typeof fn === 'function' && fn()詳解

我在看別人程式碼的時候,有看到程式碼是這樣寫的

function(){
fn&&fn()
}

大概意思是這麼個意思,但是這我感覺這樣寫好像沒意義,有帶佬能指點一下嗎

fn 不存在就什麼都不做,不會報錯,fn 存在才嘗試執行 fn

一般來說fn && fn()就如同下面的語句

if (fn) {
fn()
}

一般來說函式的動態呼叫,因為不知道這個函式確定存在才會這麼判斷

大部分情況是這個意思,如果 fn 是 undefined 就不執行 fn()。React 針對 optional callback 會這麼寫。

在 js 裡面,這是標準的。大幅減少程式碼量,比三目運算更直接了當。別的語言大同小異:fn?.xx()

這樣寫思路是對的,實現是錯誤的,fn 可能存在,但是它可能不是 function,執行 fn() 一樣會出錯。

下面分享正確的寫法

typeof fn === "function" && fn()

實際應用

function addScript (url,fn) {
 var script = document.createElement('script')
 script.setAttribute('type','text/javascript')
 script.setAttribute('src',url)
 script.setAttribute('async','async')
 document.getElementsByTagName('head')[0].appendChild(script)
 script.onload = function () {
 typeof fn === 'function' && fn()
 }
}

小結

正確寫法應該時這個吧:typeof(fn)==='function' && fn(),不過通常約定 fn&&fn() 傳遞的一定是函式

這個就是 js 邏輯運算子的魔法:
當多個 &&串聯時,執行到第一個 truthy 的表示式;
當多個||串聯時,執行到第一個 false-thy 的表示式;
但我比較贊同王垠部落格上的觀點:短路機制是給程式優化執行效率的,不是給程式設計師拿來炫技的。

更多的可以檢視這篇文章:

就是?.操作符,不包括方括號,我把引號打成方括號了。
可以參見這裡:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

進入可以選擇簡體中文。