blog

関数の拡張

length 属性は、デフォルト値が指定された関数において、デフォルト値のない引数の数のみを返します。つまり、デフォルト値の引数を持つ関数では length は歪んでしまいます。 これは、length...

Apr 8, 2020 · 4 min. read
シェア

ES6概要シリーズ - 関数の拡張

関数パラメータのデフォルト値

パラメータ変数はデフォルトで宣言されるため、let や const で再度宣言することはできません。

function foo(x = 5) { let x = 1; // error const x = 2; // error var x = 3; // }

パラメータのデフォルトを使用する場合、関数は同じ名前のパラメータを持つことはできません。

// function foo(x, x, y) { // ... } // function foo(x, x, y = 1) { // ... }

パラメーターのデフォルトは不活性に評価され、毎回再計算されます。

let x = 99; function foo(p = x + 1) { console.log(p); } foo() // 100 x = 100; foo() // 101 //引数xは関数fooが呼ばれるたびに再計算される。+1

関数の長さ属性の歪み、デフォルト値パラメータを除く、残りのパラメータ

length属性は、デフォルト値が指定された関数において、デフォルト値を持たない引数の数のみを返します。つまり、デフォルト引数を持つ関数では、lengthは歪んでしまいます。これは、length属性が関数に渡されると予想される引数の数を意味するためです。パラメータにデフォルト値が指定されている場合、期待される引数の数にはそのパラメータは含まれません

(function (a) {}).length // 1 (function (a = 5) {}).length // 0 (function (a, b, c = 5) {}).length // 2

デフォルト値が設定されたパラメータが末尾のパラメータでない場合、length属性は末尾のパラメータとしてもカウントされなくなります。

(function (a = 0, b, c) {}).length // 0 (function (a, b = 1, c) {}).length // 1

残りのパラメーターは

(function(...args) {}).length // 0

スコープ

パラメータのデフォルトが設定されていると、関数が宣言の初期化を行う際に、パラメータは別のスコープを形成し、初期化が終了するとそのスコープは消滅します。パラメータのデフォルトが設定されていない場合は、このような構文的な振る舞いは起こりません

var x = 1; function f(x, y = x) { console.log(y); } f(2) // 2

より複雑な例を示します。

var x = 1; function foo(x, y = function() { x = 2; }) { var x = 3; y();//y関数内のxは引数xを指す console.log(x); } foo() // 3 x // 1
var x = 1; function foo(x, y = function() { x = 2; }) { x = 3;//xは引数xと矛盾しない y();//y関数内のxは引数xを指す。 console.log(x); } foo() // 2 x // 1

rest

残りのパラメータは以下の形式です。

function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(2, 5, 3) // 10

rest パラメーターの後に他のパラメーターを続けることはできません。

// function f(a, ...b, c) { // ... }

残りの引数を除いた、関数の長さ属性。

(function(a) {}).length // 1 (function(...a) {}).length // 0 (function(a, ...b) {}).length // 1

アロー関数

アロー関数の thisは、それが定義されているオブジェクトであり、それが使用されているオブジェクトではありません。 アロー関数はそれ自身の thisを持たないため、内部の thisは外側のコードブロックの thisとなります。"は外側のコードブロックの thisです。

アロー関数は独自の thisを持たないため、call()、apply()、bind()を使用して thisのポイントを変更することはできません。

はコンストラクタとして使えません。

引数オブジェクトが存在しません。

オブジェクトは個別のスコープを構成しません。

ジャンプアロー関数の定義時のスコープはグローバルスコープです。

const cat = { lives: 9, jumps: () => { this.lives--; }//グローバルスコープを指す } ES6中括弧を追加{}ブロック・レベルのスコープで表現できるが、オブジェクトは個別のスコープを構成しない。

持ち帰りポイント

関数パラメータのデフォルト値

  • パラメータ変数はデフォルトで宣言されるため、let や const で再度宣言することはできません。
  • パラメータのデフォルトを使用する場合、関数は同じ名前のパラメータを持つことはできません。
  • 関数の長さ属性の歪み、デフォルト値パラメータを除く、残りのパラメータ
  • パラメーターのデフォルトは不活性に評価され、毎回再計算されます。
  • スコープ:パラメータのデフォルト値が設定され、関数が初期化のために宣言されると、パラメータは別のスコープを形成します。

休息パラメータ

  • 残りのパラメータは以下の形式です。
  • rest パラメーターの後に他のパラメーターを続けることはできません。
  • 残りの引数を除いた、関数の長さ属性。

アロー関数

  • アロー関数の thisは、それが定義されているオブジェクトであり、それが使用されているオブジェクトではありません。アロー関数はそれ自身のthisを持たないため、内部ブロックのthisアロー関数のthisとなります。thisは外部ブロックの thisです。
  • アロー関数は独自の thisを持たないため、call()、apply()、bind()を使ってthisを変更することはできません。を指しています。
  • コンストラクタとしては使用できません。
  • 引数オブジェクトが存在しないので、代わりに rest パラメータを使用してください。
  • オブジェクトは個別のスコープを構成しません
  • 、ようこそスター^_^。
Read next

Androidマルチレベル・リストの簡単な実装

データの初期化は、最初のレイヤーを初期化し、次のレイヤーがある場合は、最初のレイヤーに2番目のレイヤーのデータをぶら下げるなど、1つのレイヤーの上に別のレイヤーがあります。 3.継承、メソッドとメソッドの実装では、複数のレイアウトやスタイルを実現することができます、あなたはまた、独立したアクションの様々なを行うことができますまたはネットワークからデータの次の層を取得し、展開...

Apr 8, 2020 · 2 min read