函式的擴充套件 簡單

2021-10-12 04:54:27 字數 2941 閱讀 7556

es6可以為函式指定預設值

function

log(x, y =

'world'

)log

('hello'

)// hello world

log(

'hello'

,'china'

)// hello china

log(

'hello',''

)// hello

函式的length屬性

指定了預設值以後, 函式的 length 屬性, 將返回沒有指定預設值的引數個數。

(function

(a))

.length // 1

(function

(a =5)

).length // 0

(function

(a, b, c =5)

).length // 2

es6函式的作用域問題,背下來

let foo = 'outer';

function bar(func = x => foo)

bar();

函式 bar 的引數 func 的預設值是乙個匿名函式, 返回值為變數 foo 。 這個匿名函式宣告時, bar 函式的作用域還沒有形成, 所以匿名函式裡

面的 foo 指向外層作用域的 foo , 輸出 outer 。

var x = 1;

function foo(x, y = function() )

foo() // 3

上面**中, 函式 foo 的引數 y 的預設值是乙個匿名函式。 函式 foo 呼叫時,它的引數 x 的值為 undefined , 所以 y 函式內部的 x 一開始

是 undefined , 後來被重新賦值 2 。

函式 foo 內部重新宣告了乙個 x , 值為 3

這兩個 x 是不一樣的, 互相不產生影響, 因此最後輸出 3

如果將 var x = 3 的 var 去除兩個 x 就是一樣的, 最後輸出的就是 2 。

var x =1;

function

foo(x,y=

function()

)foo()

// 2

rest引數

function

add(

...values)

return sum;

}add(2

,5,3

)rest引數中的變數代表乙個陣列,

...values //...是擴充套件運算子,可將values變成引數序列

擴充套件運算子...可以展開陣列

...

擴充套件符的應用(1

)合併陣列

var arr1 =

['a'

,'b'];

var arr2 =

['c'];

var arr3 =

['d'

,'e'];

[...arr1,

...arr2,

...arr3]

;// [ 'a', 'b', 'c', 'd', 'e' ](2

)與解構賦值相結合

[a,...rest]

= list//a = list[0],rest = list.splice(1);(4

)將字串轉為真正的陣列

[...

'hello'

]//['h','e','l','l','o'];

////iterator和generator暫時跳過

function的name屬性返回函式的函式名
箭頭函式

記住這兩句話:

>>函式體內的 this 物件, 就是定義時所在的物件, 而不是使用時

(執行時)

所在的物件

(後者是es5傳統函式的特點)

箭頭函式導致 this 總是指向函式定義生效時所在的物件

>>箭頭函式根本沒有自己的 this , 導致內部的 this 就是外層**塊的 this

普通的函式呼叫:如果在函式a的內部呼叫函式b, 那麼在a的呼叫幀上方, 還會形成乙個b的呼叫幀。 等到b執行結束, 將結果返回到a, b的呼叫幀

才會消失。 如果函式b內部還呼叫函式c, 那就還有乙個c的呼叫幀, 以此類推。 所有的呼叫幀, 就形成乙個「呼叫棧」( call stack) 。

尾呼叫:尾呼叫由於是函式的最後一步操作, 所以不需要保留外層函式的呼叫幀,

這就叫做「尾呼叫優化」( tail call optimization) , 即只保留內層函式的呼叫幀。 如果所有函式都是尾呼叫, 那麼完全可以做到每次執行時, 呼叫幀只有一項, 這將大大節省記憶體。

注意,只有不再用到外層函式的內部變數, 內層函式的呼叫幀才會取代外層函式的呼叫幀, 否則就無法進行「尾呼叫優化」。

如果尾呼叫自身, 就稱為尾遞迴

但對於尾遞迴來說, 由於只存在乙個呼叫幀, 所以永遠不會發生「棧溢位」錯誤。

在es6中,只要使用尾遞迴, 就不會發生棧溢位, 相對節省記憶體 。

尾遞迴的實現, 往往需要改寫遞迴函式, 確保最後一步只呼叫自身。 做到這一點的方法, 就是把所有用到的內部變數改寫成函式的引數。

屬性擴充套件及函式簡單複習

利用的是私有變數可以有多個屬性,也可以返回任意值型別,從而將自己所需要的值型別利用函式方法寫出來達到自己的目的。例 nxinxi類 public class nxinxi set private string nplace public string nplace set public string...

函式的擴充套件

函式的擴充套件有以下三個方面 1 函式的預設值 2 rest引數 3 箭頭函式 函式的預設值 es5傳預設值時,的兩種方法 1 條件判斷 2 三元運算子 bug,如果a 0時,回去後面的值 var sum function a,b es6 let sum a 2,b 3 sum 2,3 rest引數...

函式的擴充套件

函式的擴充套件 1.引數預設值 2.引數的解構賦值 3.rest引數 4 擴充套件運算子 如果不傳值,則預設的值為hello,傳值之後為jieke function foo param foo jieke function foo param hello foo 引數的預設 function foo...