JavaScript Memo(三)

5371 ワード

JavaScript Memo(二)において、条件判断とサイクルを理解しました.関数と方法を見てみましょう.
関数
定義関数
JavaScriptの関数もオブジェクトです.以下に定義されるabs関数は、実際には関数オブジェクトです.関数名absは、関数を指す変数と見なされます.
function abs(x) {
    if (x >= 0) {
        return x;
    } else {
        return -x;
    }
}
function          ;
abs      ;
(x)          ,     ,  ;
{ ... }         ,        ,          
関数を呼び出す
JavaScriptは、呼び出しに影響を与えずに任意のパラメータに入ることができます.したがって、入力されたパラメータは定義されたパラメータよりも多くても大丈夫です.関数の内部にはこれらのパラメータが必要ではありません.
abs(10, 'blablabla'); //   10
abs(-9, 'haha', 'hehe', null); //   9
abs(); //   NaN
argmentsは関数の内部でのみ機能し、現在の関数の使用者からのすべてのパラメータを常に指し示し、argmentsを利用して、調整者からのすべてのパラメータを得ることができます.
function abs() {
    if (arguments.length === 0) {
        return 0;
    }
    var x = arguments[0];
    return x >= 0 ? x : -x;
}

abs(); // 0
abs(10); // 10
abs(-9); // 9
変数のスコープ
  • 変数が関数の内部で説明されると、その変数の作用領域は関数全体であり、関数の外では変数
  • を参照することができない.
  • JavaScriptの関数は入れ子可能であり、内部関数は外部関数によって定義された変数
  • にアクセスすることができる.
    'use strict';
    
    function foo() {
        var x = 1;
        function bar() {
            var x = 'A';
            alert('x in bar() = ' + x); // 'A'
        }
        alert('x in foo() = ' + x); // 1
        bar();
    }
    
    JavaScriptの関数定義には特徴があります.まず関数全体の語句をスキャンして、説明したすべての変数を関数の上に「昇格させる」という特徴があります.
    function foo() {
        var x = 'Hello, ' + y;
        alert(x);
        var y = 'Bob';
    }
    
    //      
    function foo() {
        var y; //     y   
        var x = 'Hello, ' + y;
        alert(x);
        y = 'Bob';
    }
    
    文var x='Hello、'+y;エラーではないです.変数yは後で申明します.しかし、alertはハロー、undefinedを表示し、変数yの値はundefinedであると説明しています.これはJavaScriptエンジンが変数yの宣言を自動的に引き上げたためですが、変数yの割当値は上がりません.
    グローバルスコープ
    どの関数でも定義されていない変数はグローバルスコープを持っています.JavaScriptはデフォルトではグローバルオブジェクトwindowがあります.グローバルスコープの変数は実際にwindowの属性に結び付けられています.
    var course = 'Learn JavaScript';
    alert(course); // 'Learn JavaScript'
    alert(window.course); // 'Learn JavaScript'
    
    JavaScriptは実際にはグローバルスコープしかありません.任意の変数(関数も変数として扱われます)が、現在の関数のスコープ内に見つからない場合は、上に検索を続けます.最後にグローバルスコープ内にも見つからない場合は、ReferenceErrエラーを報告します.
    名前空間
    グローバル変数はwindowに結合されます.JavaScriptファイルが同じグローバル変数を使用している場合、または同じ名前のトップ関数を定義している場合、名前が衝突します.衝突を減らす方法の一つは、自分のすべての変数と関数を一つの大域変数に結びつけることです.
    //        MYAPP:
    var MYAPP = {};
    
    //     :
    MYAPP.name = 'myapp';
    MYAPP.version = 1.0;
    
    //     :
    MYAPP.foo = function () {
        return 'foo';
    };
    
    定数
    varとletが明らかにしたのは変数です.もし一つの定数を説明するなら、ES 6の前ではだめです.ES 6標準は新しいキーワードconstを導入して定数を定義します.
    const PI = 3.14;
    PI = 3; //         ,     !
    PI; // 3.14
    
    方法
    オブジェクトに結合された関数を方法と呼び、常に現在のオブジェクトを指す特殊な変数です.
    function getAge() {
        var y = new Date().getFullYear();
        return y - this.birth;
    }
    
    var xiaoming = {
        name: '  ',
        birth: 1990,
        age: getAge
    };
    
    xiaoming.age(); // 25,     
    getAge(); // NaN
    
    高次関数
    JavaScriptの関数は実はすべてある変数を指しています.変数が関数を指すことができるので、関数のパラメータが変数を受け取ることができます.一つの関数はパラメータとして別の関数を受け取ることができます.この関数は高次関数と呼ばれます.
    function add(x, y, f) {
        return f(x) + f(y);
    }
    add(-5, 6, Math.abs);//11
    
    map関数
    Arayのmap()メソッドを呼び出して、私達自身の関数に入ってきて、結果として新しいArayを得ました.
    function pow(x) {
        return x * x;
    }
    
    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    レデュース関数
    reduce()Arayの[x 1,x 2,x 3…]に関数を作用させ、結果を連続してシーケンスの次の要素と累積計算を行う[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4).
    var arr = [1, 3, 5, 7, 9];
    arr.reduce(function (x, y) {
        return x + y;
    }); // 25
    
      [1, 3, 5, 7, 9]     13579
    var arr = [1, 3, 5, 7, 9];
    arr.reduce(function (x, y) {
        return x * 10 + y;
    }); // 13579
    
    filter関数
    Arayのいくつかの要素をフィルタリングし、残りの要素を返します.
    Arayのfilter()は、関数を受信し、導入された関数を各要素に順次作用させ、戻り値がtrueかfalseかによって、その要素を保留するかそれとも廃棄するかを決定する.
    //   Array ,    ,     
    var arr = [1, 2, 4, 5, 6, 9, 10, 15];
    var r = arr.filter(function (x) {
        return x % 2 !== 0;
    });
    r; // [1, 5, 9, 15]
    
    //  Array     
    var r,arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
    r = arr.filter(function (element, index, self) {
        return self.indexOf(element) === index;
    });
    
    ソト関数
    sort()メソッドはデフォルトではすべての要素をStringに変換して並べ替えます.sort()方法は直接Arayを修正します.その結果はまだArayです.
    ['Google', 'Apple', 'Microsoft'].sort(); // ['Apple', 'Google', 'Microsoft'];
    
    ['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", 'apple']
    
    [10, 20, 1, 2].sort(); // [1, 10, 2, 20]
    
    sort()メソッドも高次関数であり、比較関数を受信してカスタマイズした並べ替えを実現することができます.
    var arr = [10, 20, 1, 2];
    arr.sort(function (x, y) {
        if (x < y) {
            return -1;
        }
        if (x > y) {
            return 1;
        }
        return 0;
    }); // [1, 2, 10, 20]
    
    Arow Function
    ES 6規格に新たな関数が追加されました.アルロW Function(矢印関数)の定義は矢印です.
    x => x * x
       
    function (x) {
        return x * x;
    }
    
    //     :
    (x, y) => x * x + y * y
    
    //    :
    () => 3.14
    
    //     :
    (x, y, ...rest) => {
        var i, sum = x + y;
        for (i=0; i