Javascript関数のまとめ

9858 ワード

関数の定義
関数名には、アルファベット、数字、アンダースコアまたは$のみが含まれます.数字で始まることはできません.関数で表式または関数宣言文を定義できます.
var f=function fact(x){}
関数定義式には名前が含まれています.名前は関数の局所変数として関数の内部で使用されます.
関数宣言文は本当の語句ではなく、循環、条件、try/catch/finally及びwith文には現れません.ステートメント文は、実行されない位置に置いても、スコープ全体にアクセスできます.コードが定義される前に使用できます.表式を定義する変数宣言は前倒しされましたが、変数の割り当ては前倒しされません.関数は定義される前に使用できません.さもなければ、呼び出し時にエラーが発生します.「Type Error:undefined is not a function」
return文には関連する表現がない場合、undefined値を返します.一つの関数がreturn文を含まない場合、関数の体内文のみを実行し、undefinedに戻ります.リターン値の関数がなく、プロセスと呼ばれることがあります.
関数の実行
関数が実行するいくつかの方法は、関数、方法、コンストラクタ、間接的な呼び出しとして使用されます.コンストラクタがイメージされていない場合は、実際の参照リストと括弧を省略して、関数の参照を呼び出して、間隔がある場合は、空白のパラメータをnullまたはundefinedプレースホルダで置換できます.
function MyClass(name) {
    this.name = name;
    return name;  //         ?
}

var obj1 = new MyClass('foo');// MyClass  
var obj2 = MyClass('foo');// ‘foo’
var obj3 = new MyClass({});// {}
var obj4 = MyClass({});// {}
オブジェクトを参照
実際の参加対象はクラスの配列オブジェクトで、argments.calleeで再帰的に呼び出されます.パラメータをargmentsと名づけると、このパラメータは元の特殊変数をカバーします.
関数の参照と参照
指定された関数括弧内の後方の参照によって、該当する参加者にはデフォルト値がundefinedであり、これを利用して関数内部の局所変数を暗黙的に定義します.関数の入力パラメータのチェックサムがエラーを投げました.関数から実際に入力されたのは参照です.関数内部の操作は外部にも見られます.
//       
var oo = {
    x: 1, y: 2, get z() {
        return 3;
    }
}

function fns(obj) {
    obj.h = 4;
}

fns(oo);
関数の属性、方法
関数もオブジェクトですので、属性と方法、関数のlength属性、関数の変形の個数もあります.
apply方法の2番目のパラメータは、配列またはクラスの配列オブジェクトとすることができる.
bind方法はES 5において新たに追加され、関数をオブジェクトに「結合」し、一部のパラメータを導入し、入力された実参照は完全な実参照リストの左側に配置される.
/**
 * ES5.0  bind  ,ES3.0   bind,   ES3     ,         ,
 *     ,      
 * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
 */
Function.prototype.bind || (Function.prototype.bind = function (that) {
    var target = this;
    // If IsCallable(func) is false, throw a TypeError exception.
    //   call、apply   ,        
    if (typeof target !== 'function') {
        throw new TypeError('Bind must be called on a function');
    }

    var boundArgs = slice.call(arguments, 1);

    function bound() {
        //    bind        
        if (this instanceof bound) {
            var self = createObject(target.prototype);
            var result = target.apply(
                self,
                boundArgs.concat(slice.call(arguments)));
            // Object(result) === result            
            return Object(result) === result ? result : self;
        }
            //    bind           
        else {
            return target.apply(
                that,
                boundArgs.concat(slice.call(arguments)));
        }
    }

    // NOTICE: The function.length is not writable.
    bound.length = Math.max(target.length - boundArgs.length, 0);
    return bound;
});
高次関数
関数がパラメータや戻り値として使用される場合は高次関数と呼ばれます.
名前空間の関数として
関数名前空間暴露インターフェースには以下のいくつかの方法があります.
var mylib = (function (global) {
    function log(msg) {
        console.log(msg);
    }
    log1 = log;  //   :    var          , log1      (   )
    global.log2 = log;  //   :          log2  ,   log  (  )
    return {  //   :                      ,       mylib(  )
        log: log
    };
}(window));
自己更新関数
function selfUpdate() {
    window.selfUpdate = function () {
        alert('second run!');
    };

    alert('first run!');
}

selfUpdate(); // first run!
selfUpdate(); // second run!
この関数は1回だけ実行する論理に使用でき、1回目の運転の後に全体を新しい論理に置き換えることができます.
関数の表記基準
関数パラメータ定義のいくつかのコメント
/*,...*/
AP.reduce || (AP.reduce = function(fn /*, initial*/) {
    getPropertyNames(o,/*optional*/a) // /*optional*/      
    function arraycopy(/*array */ from,/*index*/from_start){};
}
記憶機能の関数
/**
 *      
 */
function memorize(f) {
    var cache = {};
    return function () {
        var key = arguments.length + '' + Array.prototype.join.call(arguments, ',');
        if (!(key in cache))
            cache[key] = f.apply(null, arguments);
        return cache[key];
    }
}