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 パラメータを使用してください。
- オブジェクトは個別のスコープを構成しません
- 、ようこそスター^_^。