blog

JS関数

1.関数の定義 2.関数自身と関数呼び出し 3.関数の要素 複数のスコープが同じ名前の変数aを持っている場合、aの宣言を探すときは、「近接の原則」と呼ばれる最も近いスコープまで行きます。aを見つけるプ...

Oct 23, 2020 · 4 min. read
シェア

関数の定義

  • 名前付き関数
function 関数名{
  
 return  
}
  • 無名関数
let a = function(x, y){ return x+y }

名前付き関数、関数名が無名であることを削除、関数式とも呼ばれます。

  • 矢印関数
let f1 = x => x*x 
let f2 = (x,y) => x+y // 括弧は省略できない。
let f3 = (x,y) => {return x+y} // 中括弧は省略できない。
let f4 = (x,y) => ({name:x, age: y}) 

オブジェクトを直接返すとエラーになるので、括弧を追加する必要があります。

  • コンストラクタ
let f = new Function('x', 'y', 'return x+y')

すべての関数は、オブジェクト、配列、関数を含む関数から構成されます。

関数そのものと関数呼び出し

  • 関数自体 fn
let fn = () => console.log('hi')
fn

fnが

  • 関数呼び出しfn()
let fn = () => console.log('hi')
fn()

は 'hi' を出力します。

関数の要素

呼び出しのタイミング

  • JS関数呼び出しのタイミング
let a = 1
function fn(){
 console.log(a)
}

が出力されます:呼び出しコードがないのでわかりません

let a = 1
function fn(){
 console.log(a)
}
a = 2
fn()

印刷されます: 2

スコープ

  • グローバル変数とローカル変数

トップレベルのスコープで宣言された変数はグローバル、ウィンドウのプロパティはグローバル、それ以外はすべてローカルです。

function fn(){
 let a = 1
}
fn()
console.log(a) // a は存在しない。
  • スコープルール

複数のスコープが同じ名前の変数を持つ場合、aの宣言は最も近いスコープを検索します。aを見つけるプロセスは関数の実行に依存しませんが、aの値は関数の実行に依存します。

function f1(){
 let a = 1
 function f2(){
 let a = 2
 console.log(a)
 }
 console.log(a)
 a = 3
 f2()
}
f1() // 1,2

クロージャ

関数が外部変数を使用する場合、関数とその変数を合わせてクロージャと呼びます。

形式のパラメータ

  • 形式的なパラメータとは、実体のないパラメータを意味します。
function add(x, y){
 return x+y
}
// ここで、xとyは実際の引数ではないので、正式なパラメータである。
add(1,2)
// addが呼ばれたとき、1と2は実際の引数であり、xとyに代入される。
// 上記のコードは次のコードとほぼ等価である。
function add(){
 var x = arguments[0]
 var y = arguments[1]
 return x+y
}

戻り値

  • すべての関数には戻り値があり、関数のみが戻り値を持ち、関数の実行が終了したときに返されます。
function hi(){ console.log('hi') }
hi()
戻り値がないので、戻り値は未定義である。
function hi(){ return console.log('hi') }
hi()

戻り値はconsole.log('hi')の値、つまり未定義です。

コールスタック

  • コールスタック

JSエンジンは関数を呼び出す前に、関数がある環境をコールスタックと呼ばれる配列にプッシュする必要があります。関数の実行が終わると、環境はポップアップされ、その後に続くコードを実行するために環境が返されます。

  • コールスタックの長さは?
function computeMaxCallStackSize() {
 try {
 return 1 + computeMaxCallStackSize();
 } catch (e) {
 // エラー:スタックオーバーフロー
 return 1;
 }
}

Chrome 12578; Firefox 26773; Node 52136

  • スタックバースト

コールスタックに多くのフレームが押し込まれると、プログラムはクラッシュします。

関数の拡張

  • function fn(){} 名前付き関数がどこで宣言されても、最初の行まで実行されます。
  • let fn = function(){}これは代入で、右側の匿名関数宣言は

argumentsと this。

  • 矢印関数を除き、すべての関数には引数と thisがあります。
  • 引数を渡すためにfnを呼び出します
  • fn(1,2,3) 引数は[1,2,3]
  • 現在、thisと引数をfn.call(xxx, 1,2,3)で渡すことができ、xxxは自動的にオブジェクトに変換されます。
  • thisは隠しパラメータで、引数は通常のパラメータです。
  • this "でオブジェクトへの参照を取得します。
let person = {
 name: 'frank',
 sayHi(this){
 console.log(`こんにちは、私の名前は` + this.name)
 }
}
person.sayHi()
 
person.sayHi(person)
と人を thisに渡す。
こうすることで、どの関数も thisを使って未知のオブジェクトへの参照を得ることができる。
  • thisがお勧めです。
fn(1,2) // はfnと等価である。.call(undefined, 1, 2)
obj.child.fn(1) // はobjと等価である。.child.fn.call(obj.child, 1)

矢印関数

内側の "これ "は外側の "これ"。

console.log(this) // window
let fn = () => console.log(this) 
fn() // window
fn.call({name:'frank'}) // window

即時関数

  • 目的:ローカル変数の取得

  • 方法:無名関数の前に演算子を追加します!, ~, (), +, - が使えますが、!

Read next

Linuxシステムノート メモリー管理

物理メモリは常に連続したページ単位のブロックで構成されていると考えてください。物理ページには0から始まる番号を付けることができるので、各物理ページにはページ番号が付きます。物理アドレスは連続しているので、ページも連続しており、各ページのサイズは同じです。したがって、どのアドレスに対しても、各ページのサイズを直接割って、どのページ上にあるのかを割り出すのは簡単です。各ページには構造体...

Oct 22, 2020 · 6 min read