javascript callとappy

4392 ワード

各関数には相続ではない二つの方法が含まれています.
この二つの方法で関数を間接的に呼び出すことができます.このようにしてもいいです
f.call(o);

f.apply(o);

//o       f  
これは以下の機能と似ています.
o.m = f;

o.m();

delete o.m//      
構文:
fn.call(obj,arg 1,arg 2,arg 3…)             fn.apply(obj,[arry]/argments)     [applyの2番目のパラメータは、純粋な配列でも良いし、クラスの配列でもいいです.]
es 5厳密モードでは、最初のパラメータはいずれもthis値になります.また、es 3と非厳密モードでは、undefinedとnullはグローバルオブジェクトに取って代わられ、他の元の値は対応するパッケージの対象に取って代わられます.
 
「callとapplyの一番強いところは、関数を拡張して機能を実行できる機能領域です」というブログの多くは、このように記述していますが、実はこのような言い方は間違いです.絶対間違いです.だから私は「落とし穴」という言葉を使いません.JSは静的語法の作用域であり、文法の定義に基づいて作用域を決定しているため、その作用域は実際には拡張できないが、thisは はい、 contextは、変更することができますcallとapplyは、変更されたのはthisです.変更されたのはコンテキストです.
以下は一例です.
var name = "   ",

    age = 25;

function say(){

    console.log("name : " + this.name);

    console.log("age : " + this.age);

}

var obj = {

    name : "bb ",

    age : 30

}

say(); //name :     age : 25 

say.call(obj);//name : bb  age : 30 
もし私達がcall方法を使わないなら、私達はどうやってobjでsayという関数を呼びますか?
var name = "   ",

    age = 25;

function say(){

    console.log("name : " + this.name);

    console.log("age : " + this.age);

}

var obj = {

    name : "bb ",

    age : 30

}

say(); //name :     age : 25 

obj.say = say;

obj.say();//name : bb  age : 30
callを使うほうが便利だと分かります.
 
requireの枠組みの中のrequire関数を使ったことがあるかもしれません.とても不思議です.これは1つの配列を逐次1つのコールバック関数のパラメータに入れることができますが、実はそのモデルはとても簡単です.
以下は例です
var noop = function(){};

function require(list,fn){

    fn.apply(noop,list);

}

require([1,2,3],function(a,b,c){

    console.log(a);

    console.log(b);

    console.log(c);

})
今日はここまでです.