関数とブートの作成

23067 ワード

護衛とは何ですか?


我々が過去の位置決めで述べたように,動作をコードの先頭に引き上げる動作をHostingと呼ぶ.
コードで例を挙げる
<script>
console.log(add(2,5)) ; //7
console.log(sub(2,5)); // undifined

function add(x,y){
  return x + y;
}

var sub =function (x , y) {
  retutn x - y
} 

</script>
なぜadd関数の値が正しいのか、subに値がないのか.
上記の例に示すように、関数宣言文で定義された関数は、関数宣言文の前に呼び出すことができます.
これは,関数宣言の動作が一番上に引っ張られたように,宣言−呼び出しの順序で動作するためである.
ではなぜsubは未定義の方法で操作されるのでしょうか.
その原因は変数反発にある.
関数式で関数を定義すると、関数宣言文で定義されていないため、変数エスケープが発生します.
すなわち、上記のコードにおけるsub動作は、以下の例に示す.
<script>

function add(x,y){
  return x + y;
}

var sub;

console.log(add(2,5)) ; //7
console.log(sub(2,5)); // undifined
 

</script>
変数ドリフトが発生したのでvarsubだけ引き上げられ、こうすると
変数undefinedは値として参照されます.

矢印関数


ES 6に導入された矢印関数は、functionキーワードではなく矢印=>を使用します.
関数は簡略化された方法で宣言できます.
矢印関数は常に匿名関数として定義されます.
矢印関数のコード例を見てみましょう.
<script>
const add = (x,y) => x + y ;
console.log(add(2,5)); // 7
</script>
矢印関数は、既存の関数とはバインド方法が異なり、プロトタイプ構成はありません.
パラメータオブジェクトは作成されません.詳細については、今後の位置付けで説明します.
これはよく使われる文法で、矢印関数を熟知してみましょう.

パラメータとパラメータの関係


関数の実行に必要な値を関数の外部から関数の内部に渡す場合があります.
この場合、パラメータパラメータはパラメータパラメータパラメータによって伝達される.
引数は、値から計算できる式でなければなりません.
パラメータは、関数を呼び出すときに指定され、数とタイプは制限されません.
<script>
function add(x,y){
	return x + y;
}
var result = add(1,2)
</script>
この構造では,コードの動作順序はこうである.
1.add関数の定義が完了しました.
2.add関数の本体はx+y演算が完了した後に値を返します.
3.add()関数に1つまたは2つの値を加えて呼び出します.
4(1,2)を加えたのはfunction add(x,y)コードのx,yが値を順次移動する.
5.そしてその1、2はドアに戻る演算で値を生成します.//3
6.varresultは変数にadd(1,2)関数を割り当て、var結果は3である.

パラメータの参照


パラメータは、関数本体内でのみ参照できます.
関数体の外部は参照できません.
すなわち,パラメータのスキャン(有効範囲)は関数内部である.
コードで例を挙げます.
<script>
 function add(x,y){
  console.log(x,y); // 2 5
  return x + y;
 }
 add(2,5);
 
 add함수의 매개변수 x,y는 함수 바디 내부에서만 참조할 수 있다.
 console.log(x,y) // ReferenceError : x is not defiend
</script>
関数のパラメータは本体内で参照できることを覚えておいてください.

パラメータの個数とパラメータの個数


関数は、引数の個数が引数の個数と一致するかどうかをチェックしません.
これは、関数を呼び出すと、通常、パラメータの数に基づいてパラメータが渡されることを意味します.
エラーは発生しません.
パラメータが欠落しているためパラメータが割り当てられていない値は定義されていません.
コードで例を挙げる.
<script>
 function add(x,y){
  return x + y;
 }

console.log(add(2));  // nan 2+undifined 기 때문에 not a number 출력
</script>

超過パラメータ

코드를 입력하세요
<script>
 function add(x,y){
  return x + y;
 }
 console.log(add(2,5,9)) // 7
 </script>
超過した買収はこのように捨てられてはいけない.
すべてのパラメータは、パラメータオブジェクトのpropertyとしてデフォルト設定されます.

関数の引数の確認


関数を定義する場合、JavaScriptは適切なパラメータが渡されたかどうかを決定する必要があります.
次のコードで例を挙げます.
<script>
function add (x,y){
if(typeof x !== "number" || typeof y !=="number" ){
// 매개변수를 통해 전달된 인수의 타입이 부적절할때 에러 발생
throw new typeError("인수는 모두 숫자 값이어야 합니다.")
}
return x + y ;
}
console.log(add(2)) // TypeError:인수는 모두 숫자 값이어야 합니다.
console.log(add("a","b")) //TypeError:인수는 모두 숫자 값이어야 합니다.
</script>
type ofでデータ型を識別し、制御文を使用してコードを実行します.

パラメータの最大数


ECMAScript仕様では、パラメータの最大数は制限されません.
ECMAスクリプトとは?
ECMAスクリプト(ECMA Script、またはES[1])とは、ECMA国際がECMA-262技術仕様に従って定義した標準化スクリプトプログラミング言語を指す.Javascriptを標準化するために作成します.アクションスクリプトやJスクリプトなど他の実装体も含まれている.[2]ECMAスクリプトは、通常、Webのクライアントスクリプト、ノードとして使用される.jsを使用するサーバアプリケーションやサービスがますます増えています.ウィキペディアソース
関数のパラメータはコードの理解を妨げる要因である.
理想パラメータの個数は0で、少ないほど良いです.
パラメータの数が多いのは関数が多くのことをしている証拠です.
取るに足らない.
理想的な関数は一つのことしかできないので、できるだけ小さくすることをお勧めします.

戻り文の戻り


関数の重要な概念return文について説明します.
returnキーワードは、式(戻り値)からなる戻り文を使用します.
関数の外部に戻ることができます.
コードで例を挙げる.
<script>
function multiply(x,y){
return x * y; // 반환문
}
//함수 호출은 반환값으로 평가된다.
var result = multiply(3,5);
console.log(result); // 15 
</script>
上記の関数はreturnキーワードによって2つの引数を乗算した結果値を返します.
返される値はvarresultに割り当てられるため、varresultのコンソールでの値は15です.

関数の最後の文を実行した後のサイレント動作


関数では、戻り文を省略できます.
このとき、関数は関数体の最後の文に実行され、デフォルトでは定義されていません.
コードで例を挙げる.
<script>
function foo(){
return;
}
console.log(foo()); // undifined
</script>
このコードから,これは非常に重要な概念であることがわかる.
文が関数内部のコードで実行されると、デフォルトではundefinedが返されます.
初心者にとっては、いったいどこから来たのか罰金が科せられていないのかもしれません.そう思うはずだ.
この場合はreturnを省略して発生する問題がほとんどですので、参考にしてください.

参照による外部ステータスの転送と変更


元の値は値で渡され、オブジェクトは参照で渡されます.
パラメータの関数内での処理方式は変数と同じであるため,パラメータも
タイプ別に値別に渡す、参照別に渡す
そう言うのは難しいので、直接コードで確認してみましょう.
<script>
//매개변수 primitive는 원시 값을 전달받고, 매개변수 obj는 객체를 전달받는다.
function changeVal(primitive,obj){
primitive += 100;
obj.name = "Kim"
}

//외부상태
var num = 100;
var person ={name:"Lee"};

console.log(num) ; //100
console.log(person) //{name:"Lee"};

changeVal(num,person) // 원시 값은 값 자체가 복사되고 객체는 참조 값이 복사되어 전달

console.log(num) ; //100 원시값은 원본이 훼손되지 않는다.
console.log(person) ; //{name:"Kim"} 객체는 원본이 훼손된다.


</script>
動作原理を説明します.
1.changeVal関数が定義されています.
2.changeVal関数は、元の甲と対象をパラメータとして受け入れます.
3.外部で作成されたグローバル変数varnum=100;
4.外部で作成されたグローバルオブジェクトvarpersonのキー値(name)bellクラス値は(「Lee」)です.
5.コンソールで撮ったとき、3、4番がよく撮れました.
6.changeVal関数の因数としてnum,personを加える.
7.引数num,personはchangeVal関数のprimitive,objの順に入る.
8.この状態で、コンソールコンソール.log(num)を使用すると、元の値なので元の破損は発生しません.
9.console.log(person)ではLeeを加えているのでLeeが現れるはずですが、changeVal関数で定義したobjを先に使用します.nameの影響で出力はLeeではなくKimです.これにより、オブジェクトのオリジナルが破損することがわかります.
今日は様々な関数の概念を理解しました.
次のレッスンでは、すぐに実行する関数について説明します.