JavaScript基礎の8(functionsと閉鎖)
5475 ワード
1.functionの呼び出しには、①普通関数呼び出し②方法としての呼び出し(関数を対象とする属性が方法となる)③コンストラクターコール④call、appyメソッドを呼び出します.
2.thisはjavascriptのキーワードで、thisは機能領域がなく、呼び出しの関数と関係があります.または、厳格なモードでundefinedができます.ネストの関数thisは外部関数を指しません.次のコード:
3.argments.callee:現在実行されているFnctionを指し、匿名関数が再帰的に呼び出される時に使用できます.ES 5の厳格なモードでは使用できません.
5.クローズド:関数オブジェクトと関数に含まれる変数のスコープの組み合わせはクローズドです.キーワードは関数オブジェクトとスコープです.技術的に言えば、すべてのjavascript関数は閉鎖されています.ほとんどの関数が呼び出される時に使うのは定義時のスコープなので、あまり注目されません.関数ネストの中に閉じ込めるのはちょっと面白いです.普段は基本的に無視します.関数ネストによって異なる作用領域ができます.クローズドを理解する一番基本的な原則は、関数が実行する時に使用するのが定義時の作用ドメインチェーンです.たとえば:
6.クローズドの一例コード
7.関数のlength属性:関数が定義されているときに期待するパラメータの個数(括弧内のパラメータの個数)を表します.
8.bind方法:関数をオブジェクトに結びつけると、関数のthis指向を変えて、bind方法は新しい関数を返します.コードの説明は以下の通りです.
2.thisはjavascriptのキーワードで、thisは機能領域がなく、呼び出しの関数と関係があります.または、厳格なモードでundefinedができます.ネストの関数thisは外部関数を指しません.次のコード:
var o = { // o
m: function() { // m
var self = this; // this , this o
console.log(this); // true
f(); //
function f() { //
console.log(this===window); // "false"
console.log(self); // "true"
}
}
};
o.m();
ここで注意したいのですが、mの内部でネスト関数f()を呼び出して、thisはwindowを指しています.oではなく、thisは呼び出しと関係があります.ここはwindowを指しています.見ているとwindowの呼び出しのようです.もしwindow.f()に変えたら、ここでWindows.f not definedを間違えます.ここで注意してください.3.argments.callee:現在実行されているFnctionを指し、匿名関数が再帰的に呼び出される時に使用できます.ES 5の厳格なモードでは使用できません.
var factorial = function(x) {
if (x <= 1) return 1;
return x * arguments.callee(x - 1);
};
console.log(factorial(5));//120
4.argments.caller:この属性はもう廃棄されましたので、もう使わないでください.コールを行う関数です.5.クローズド:関数オブジェクトと関数に含まれる変数のスコープの組み合わせはクローズドです.キーワードは関数オブジェクトとスコープです.技術的に言えば、すべてのjavascript関数は閉鎖されています.ほとんどの関数が呼び出される時に使うのは定義時のスコープなので、あまり注目されません.関数ネストの中に閉じ込めるのはちょっと面白いです.普段は基本的に無視します.関数ネストによって異なる作用領域ができます.クローズドを理解する一番基本的な原則は、関数が実行する時に使用するのが定義時の作用ドメインチェーンです.たとえば:
var scope = "global scope";
function checkscope() {
var scope = "local scope";
function f() {
return scope;
}
return f;
}
console.log(checkscope()());//"local scope"
=====================================================
var scope = "global scope";
function checkscope() {
var scope = "local scope";
function f() {
return scope;
}
return f();
}
console.log(checkscope());.//"local scope"
上の二つのコードの実行結果は同じです.閉パック中のスコープは定義された時だけ関係があります.関数の中で関数を呼び出すか、それとも関数の外で関数を呼び出すかは関係がありません.関数を呼び出すたびに、新しいオブジェクトを作成して、いくつかのlocalの変数を保存します.これらの変数は呼び出しが必要なときに使います.このオブジェクト(変数バインディングのオブジェクト)は、スコープ内に追加されます.関数が戻ると、このオブジェクトはスコープ内から削除されます.この変数に他の引用がないと、GCになります.ネスト関数が定義されている場合は、ネスト関数を返したり、ネストの関数を属性に格納したりします.このように外部からの引用があります.この入れ子の関数はGCではなく、オブジェクトもGCではありません.6.クローズドの一例コード
var uniqueInteger1 = (function() {
var counter = 0;
return function() {
return counter++;
};
}());
var uniqueInteger2 = (function() {
var counter = 0;
return {
count: function() {
return counter++;
},
reset: function() {
counter = 0;
}
};
}());
クローズドベースの基本を理解すると、語法のスコープ、関数呼び出し時のスコープが使用される関数定義時のスコープです.7.関数のlength属性:関数が定義されているときに期待するパラメータの個数(括弧内のパラメータの個数)を表します.
8.bind方法:関数をオブジェクトに結びつけると、関数のthis指向を変えて、bind方法は新しい関数を返します.コードの説明は以下の通りです.
function f(y, z) {
console.log(this); //Object {x:1}
return z ? this.x + y + z : this.x + y;
}
var o = {
x: 1
};
var g = f.bind(o, 10);// this , , 。 y 10
console.log(g());//
console.log(g(2));// z 2
console.log(g.prototype); //undefined bind prototype
9.関数の定義方式new Function()とfunctionキーワード.new Functionによって構成された関数は、語法のスコープによらず、大域的である.なるべく使わないようにします var fn1=new Function('x','y','return x+y;');
function fn2(x,y){return x+y;}//fn1 fn2
console.log(fn1(1,2));
console.log(fn2(1,2));
10.高次関数:関数をパラメータとして返します.