javascript callとappy
4392 ワード
各関数には相続ではない二つの方法が含まれています.
この二つの方法で関数を間接的に呼び出すことができます.このようにしてもいいです
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です.変更されたのはコンテキストです.
以下は一例です.
requireの枠組みの中のrequire関数を使ったことがあるかもしれません.とても不思議です.これは1つの配列を逐次1つのコールバック関数のパラメータに入れることができますが、実はそのモデルはとても簡単です.
以下は例です
この二つの方法で関数を間接的に呼び出すことができます.このようにしてもいいです
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);
})
今日はここまでです.