2021-12-16(木)第6週第4日


consoleには値を返す関数がありません.logで出力したら?
未定義の出力
パラメータと仕様
≪パラメータ|Parameters|ldap≫:関数で使用される値を受信する変数
Javascript関数を呼び出す場合、仕様の数は関数で定義されたパラメータの数と一致する必要はありません.エリアン灸.
parameter:受信値の変数
パラメータ:関数呼び出し時に渡される値
同じ名前の関数は同時に存在しません.最後に定義した関数として使用します.
既存の関数を上書きします.
JavaScriptのすべての関数にargumentsという組み込み変数があります.

Prototype←「プロトタイプ」の意味
ジェネレータ、オブジェクト、prototype
①new→空のオブジェクトの作成
空のオブジェクトにはkey値とvalue値が含まれます.
Array()の祖先はObject()です.
Array作成者は内部でオブジェクトを検索します.
function Array()の内部構造から見ると、最初の文は、まず、所与のオブジェクトに対してObject()を呼び出す.
function Array() {
  this.Object();
Arrayという名前の作成者が操作を実行する前に、まずObjectという名前の作成者が操作を行います.Objectという名前のジェネレータが継承されていることを示します.
Arrayが呼び出されると、最初に出会った文はオブジェクトを呼び出します.
①Object関数に変数と関数を追加
②Object()関数に変数と関数を追加
③Array()関数に変数と関数を追加する
このようにオブジェクトを初期化する関数を「コンストラクション関数」と呼ぶ.
初期化オブジェクトの意味は?
準備オブジェクトは、特定のロールに必要な変数または関数として機能します.
プロトタイプ:オブジェクトを初期化する作成者を指します.
以前の騎手は授業を受けていたが、授業が終わった後、新しいクラスを授業させるために、授業を見るという業務に必要なものをすべて手配した.
その関数がコンストラクション関数です
作成者によって初期化されたオブジェクト
ロールを実行するために必要な変数または関数を「オブジェクト(object)」と呼びます.
このオブジェクトは誰が初期化したのですか?[[Prototype]]: Arrayあ、このオブジェクトはArrayという名前の作成者によって初期化されました.
prototypeは、オブジェクトがどの作成者によって初期化されたかを表示します.
オブジェクトの初期化がArrayでない場合は配列ではありません
似たような配列の子供
論点は並べられていない.
function f5(a) {
	arguments.forEach(function(value) {
		console.log(value);
	})
}

f5(100, 200, 300, 400);
console.log("----------------");
arguments内蔵変数はArray()で初期化された配列オブジェクトではないため、関数forEach()はありません.
関数も変数のように自動的にwindowオブジェクトに属します.
関数オブジェクト
function=object+functionbody(関数コード)
var f1;

f1 = function(a) { 
	console.log(a + "님, 안녕!");
};
変数を作成し、変数に関数を定義します.
次の現在のスクリプトタグで定義されていない関数は、エスケープターゲットではありません.スクリプトタグを実行するときにエスケープを実行します.
割り当てのドアが上がらない.
ジェキュアは内部でもできます.
ブラウザ間ですべて開く
なぜJで検索するのですか?
クロスブラウズで使用します.
ブラウザに関係なく、同じ機能を使用できます.
伝達関数オブジェクトアドレス
play(plus); ←plusという関数のアドレスを渡す
伝達関数→伝達関数のアドレス
呼ばれるのではなく、私たちが電話機で呼んだのです.
パラメータまたは変数にロールバック
呼び出しパラメータが受信する関数ではないのでコールバック関数ではありません.
関数に関数を作成して返すことができます.
キャビネット(closure)
http://localhost:8080/javascript/ex03/exam10.html
createInterestCalculator()関数は、内部で定義された関数のアドレスを返します.
このように関数で定義される関数を「閉パッケージ」と呼ぶ.
モジュール:関数で定義された関数
モジュールとローカル変数
http://localhost:8080/javascript/ex03/exam11-1.html
外部関数のローカル変数
ローカル変数は、関数呼び出しの終了時に消えます.
関数呼び出しが終了すると、その関数によって作成されたローカル変数も削除されます.
name, message
メッセージ変数の値を出力!
メッセージという変数はありません
間違い男.よく撮れました
この関数にはmessage変数がありませんが、どのように出力されますか?
これがいわゆる
ローカル変数は関数の終了時に消えます
Javaでオーバーラップクラスを学習する場合も同様の原理です
メソッド呼び出し終了後に消える変数
パラメータもローカル変数
呼び出し時に作成および消去
createGreetingという名前の関数が1000回呼び出された場合、ローカル変数は1000回作成され、1000回消去されます.
外部関数のローカル変数を使用する場合は、エンクロージャ共通メモリにコピーします.
この値をエンクロージャ共通メモリにコピーして、外部関数の実行後も使用可能にします.
消える前に値をコピーしたので、その値がわかります.
消える前にcountという変数の値をコピーします.
このようにモジュールを定義すると、モジュールが使用する外部関数のローカル変数countがモジュール管理の独立したメモリにコピーされます.
したがって、外部関数の実行が完了しても、ローカル変数が消えても、モジュールはコピーされた変数を使用し続けることができます.
同じモジュールの場合は、同時に作成したモジュールで変数を共有します.
Closer間で共有します.
クローン間のレプリケーション変数の共有
// 3) 한 문장만 있을 때는 중괄호를 제거할 수 있다.
// 4) 그 한 문장이 리턴 문장일 경우 return을 생략해야 한다.
// 그리고 문장의 끝을 나타내는 세미콜론을 제거해야 한다.
var f3 = () =>
	"안녕";
;
console.log(f3());
//または、匿名関数を定義し、仕様に直接渡すことができます.
play(function(a, b) {return a - b;});//関数アドレス
Play(関数アドレス)
関数を呼び出すのではなく、関数を定義します.
トランスファ関数アドレス
play((a, b) => a - b);
//arrow関数を定義し、仕様に直接渡すこともできます.
play((a, b) => a * b);//関数を実行するのではなく、関数を定義します.
関数もオブジェクトなのでpropertyを追加できます.
一筆消して、プロと呼ぶ.
ブラウザでよく使用される組み込み関数
web\app\src\main\resources\static\javascript\ex03\exam16-1.html
setTimeout
Windowsオブジェクトに属する
登録


登録とコール
window.setInterval(関数、経過時間);
登録した瞬間からコールが始まります.
clearInterval
16-5への移行
JSON.parse()
"hello"
小文字true{"name" : "nana"}{name: 'nana'} ["apple", "banana"]['apple', 'banana']単一クエリーはできません.二重クエリーでなければなりません.
オブジェクトは最後のプロパティの後にカンマを付けることはできません
アレイもそうです
異機種プラットフォーム間でのデータ交換はJSONで行います
JavaScriptオブジェクト==変換=>JSON形式の文字列
匿名関数を1回だけ実行する場合は、変数に含めず、すぐに呼び出す必要があります.
この場合、インスタント実行関数を使用できます.
8日から17日まで
MyListプロジェクト-ContactController.java
処理方法
•特定の機能を実行するコードをメソッドとして定義すると、コードの再利用とメンテナンスが容易になります.
•コードの分割方法
‐類似のコードを複数箇所で繰り返し使用する場合
‐コードの機能を明確に説明したい場合
重複コードを分離し、メソッドとして定義します.CSV(comma-separated values)CSV:データを構成するフィールドのデータ型をカンマで区切る
comma-separated values
comma-separated variables
record = row = entity = object
column = field = attribute
メソッドは、1人の連絡先情報を文字列とするコードを分離します.ContactController.createCSV()
  String createCSV(String name, String email, String tel, String company) {
    return name + "," + email + "," + tel + "," + company;
  }
全↓
  @RequestMapping("/contact/add")
  public Object add(String name, String email, String tel, String company) {
    String contact = name + "," + email + "," + tel + "," + company;
    contacts[size++] = contact;
    return size;
  }
後↓
  @RequestMapping("/contact/add")
  public Object add(String name, String email, String tel, String company) {
    contacts[size++] = createCSV(name, email, tel, company);
    return size;
  }
全↓
  @RequestMapping("/contact/update")
  public Object update(String name, String email, String tel, String company) {
    String contact = name + "," + email + "," + tel + "," + company;
    for (int i = 0; i < size; i++) {
      if (contacts[i].split(",")[1].equals(email)) {
        contacts[i] = contact;
        return 1;
      }
    }
    return 0;
  }
後↓
  @RequestMapping("/contact/update")
  public Object update(String name, String email, String tel, String company) {
    for (int i = 0; i < size; i++) {
      if (contacts[i].split(",")[1].equals(email)) {
        contacts[i] = createCSV(name, email, tel, company);
        return 1;
      }
    }
    return 0;
  }
ステップ2-Eメールで連絡先を検索し、インデックスの配置を決定するコードを分離します.ContactController.indexOf()
  // 기능:
  // - 이메일로 연락처 정보를 찾는다.
  // - 찾은 연락처의 배열 인덱스를 리턴한다.
  //
  int indexOf(String email) {
    for (int i = 0; i < size; i++) {
      if (contacts[i].split(",")[1].equals(email)) {
        return i;
      }
    }
    return -1;
  }
全↓
  @RequestMapping("/contact/get")
  public Object get(String email) {
    for (int i = 0; i < size; i++) {
      if (contacts[i].split(",")[1].equals(email)) {
        return contacts[i];
      }
    }
    return "";
  }
後↓
  @RequestMapping("/contact/get")
  public Object get(String email) {
    int index = indexOf(email);
    if (index == -1) {
      return "";
    } 

    return contacts[index];

  }
全↓
  @RequestMapping("/contact/update")
  public Object update(String name, String email, String tel, String company) {
    for (int i = 0; i < size; i++) {
      if (contacts[i].split(",")[1].equals(email)) { 
        contacts[i] = createCSV(name, email, tel, company);
        return 1;
      }
    }
    return 0;
  }
後↓
  @RequestMapping("/contact/update")
  public Object update(String name, String email, String tel, String company) {
    int index = indexOf(email);
    if (index == -1) {
      return 0;
    }

    contacts[index] = createCSV(name, email, tel, company);
    return 1;
  }
java documentation 11 api
https://www.oracle.com/java/technologies/java-se-support-roadmap.html

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/List.html

改造する
コメントを貼り付けるコードは直接分離されます.
メソッド名が適切に取得されます.
手順3-配列項目削除コードを分離します.
コードの機能を明確に説明したい場合は、ドメインを使用してコードを分離できます.
Javaにすでに存在している方法を模倣すること自体が後で理解され、使用される.
今は書かないが、私たちはそれを作りましょう.
  // 기능:
  // - 배열에서 지정한 항목을 삭제한다.
  // 
  String remove(int index) {
    String old = contacts[index];
    for (int i = index + 1; i < size; i++) {
      contacts[i-1] = contacts[i]; // 한 칸씩 앞으로 당긴다
    }
    size--;
    return old;
  }
全↓
  @RequestMapping("/contact/delete")
  public Object delete(String email) {
    for (int i = 0; i < size; i++) {
      if (contacts[i].split(",")[1].equals(email)) {
        // 현재 위치의 다음 항목에서 배열끝까지 반복하여 앞으로 값을 당겨온다.

        for (int j = i + 1; j < size; j++) {
          contacts[j-1] = contacts[j];
        }
        size--;
        return 1; 
      }
    }
    return 0;
  }
全↓
  @RequestMapping("/contact/delete")
  public Object delete(String email) {
    int index = indexOf(email);
    if (index == -1) {
      return 0;
    }

    for (int j = index + 1; j < size; j++) {
      contacts[j-1] = contacts[j];
    }
    
    return 1;

  }
後↓
  @RequestMapping("/contact/delete")
  public Object delete(String email) {
    int index = indexOf(email);
    if (index == -1) {
      return 0;
    }

    remove(index);
    return 1;

  }
手順4-アレイのサイズを自動的に増やします.