JavaScript匿名関数とクローズド紹介
11912 ワード
匿名関数:名前のない関数;クローズド:関数のスコープ内の変数の関数にアクセスできます.
匿名関数
クローズド:別の関数のスコープ内の変数の関数にアクセスする権限があります.閉じたパケットを作成する一般的な方法:関数の内部に別の関数を作成します.この関数の局所変数には他の関数を介してアクセスします.
JavaScriptプログラミングにおいて、関数式は非常に有用な技術である.関数式を使うと、関数に名前を付ける必要がなく、動的プログラミングが可能です.
1.関数式
関数宣言とは異なる関数式.関数宣言には名前が必要ですが、関数式は必要ありません.名前のない関数表現を匿名関数と呼びます.2.クローズドは、関数の内部に他の関数を定義すると、クローズドパケットを作成します.クローズドは、関数の内部を含むすべての変数にアクセスする権利があります.原理は以下の通りである.バックグラウンド実行環境において、クローズドの役割ドメインチェーンは、自身の役割領域、関数を含む作用領域、およびグローバル作用領域を含む.通常、関数のスコープおよびそのすべての変数は関数実行終了後に破壊されます.しかし、関数がクローズドバックに戻った時、この関数のスコープはメモリに存在しなくなるまで保存されます.3.ブロックレベルの作用領域は、クローズドパケットを使用して、JavaScriptでブロックレベルの作用領域を模倣することができる(JavaScript自体はブロックレベルの作用領域の概念がない).要点下記のように、関数を作成し、直ちに呼び出します.コードを実行することもできますし、メモリにその関数への参照を残しません.結果として、関数内部のすべての変数は直ちに破壊されます.作用領域(すなわち外部作用領域)を含む変数に特定の変数の割り当て値を与えない限り、4.プライベート変数のクローズドは、オブジェクト内でプライベート変数を作成するためにも使用できます.ポイントは、JavaScriptに真のプライベートオブジェクト属性の概念がないとしても、クローズドを使用して公開方法を実現することができ、公有法により、作用領域に定義された変数にアクセスすることができます.コンストラクターモード、プロトタイプパターンを使用して、ユーザー定義型の特権的な方法を実現することができます.モジュールモードを使用して、単例の特権的な方法を実現することもできます.
匿名関数
//
function box(){ // box;
return 'Lee';
}
box(); // =>Lee; ;
//
function(){ // , ;
return 'Lee';
}
//
(function(name){
console.log(name); // =>Lee;
})("Lee"); // "()" , ;
//
var box = function(){ // ;
return 'Lee';
};
console.log(box()); // ;
//
function box(){
return function(name){ // , ;
return name;
};
};
console.log(box()("Lee")); // box() , ;
二重閉鎖クローズド:別の関数のスコープ内の変数の関数にアクセスする権限があります.閉じたパケットを作成する一般的な方法:関数の内部に別の関数を作成します.この関数の局所変数には他の関数を介してアクセスします.
//
function box(){
var user = 'Lee';
return function(){ // box() user;
return user;
};
}
console.log(box()()); // =>Lee; box()() ;
var b = box();
console.log(b()); // =>Lee; ;
// : , ;
// ( , ; , );
// :
//
var age = 100; // ;
function box(){
age++; // , ;
};
box(); // , ;
console.log(age); // =>101; ;
box(); // , ;
console.log(age); // =>102; ;
//
function box(){
var age = 100;
age++; // ;
return age;
}
console.log(box()); // =>101;
console.log(box()); // =>101; , , age ;
//
function box(){
var age = 100;
return function(){ // ;
age++;
return age; // ;
}; // box() age ;
}
var b = box(); // box() ;
console.log(b()); // =>101; , ;
console.log(b()); // =>102; , ;
// PS: , ; ;( " " )
// , ; ?
//
function box(){
var arr = [];
for(var i=0; i<5; i++){ // i=5 , ; i==5;
arr[i] = function(){ // arr[i] function(){};
return i;
};
};
return arr; // arr = [function,function,function,function,function];
}
var b = box(); // =>[function,function,function,function,function]; box() arr;
console.log(b.length); // =>5; ;
for(var i=0; i5,5,5,5,5; , ;
}
// 5, i ;
// b[i] , , ,box() ,i 5;
// - 1,
function box(){
var arr = [];
for(var i=0; i<5; i++){
arr[i] = (function(num){ // arr[i] 0-4;
return num;
})(i); // ;
}
return arr;
}
var b = box(); // =>[0,1,2,3,4]; b box() ;
for (var i = 0; i < b.length; i++) {
console.log(b[i]); // 0 1 2 3 4; ;
};
// , , a[i] ; b[0]-b[4] 0,1,2,3,4 ;
// - 2, ;
function box(){
var arr = [];
for(var i=0; i<5; i++){
arr[i] = (function(num){
return function(){ // ;
return num;
}
})(i);
}
return arr; // arr = [function,function,function,function,function];
}
var b = box();
for (var i = 0; i < b.length; i++) {
console.log(b[i]()); // 0,1,2,3,4;
};
// 1 2 , , arr[i];
// i, , i; box() i;
三thisオブジェクト
// this ;this ;
// this window, ;
// window , ;
var user = 'Window';
var obj = {
user:'Object',
getUserFunction:function(){
return function(){ // obj, this window;
return this.user;
};
}
};
console.log(obj.getUserFunction()()); // =>Window;
//
console.log(obj.getUserFunction().call(obj)); // =>Object;
//
getUserFunction:function(){
var that = this; // this; that obj ;
return function(){
return that.user;
}
}
console.log(obj.getUserFunction()()); // =>Object;
四メモリ漏れ
// IE JScript DOM , IE , ;
function box(){
var oDiv = document.getElementById('oDiv'); // oDiv ;
oDiv.onclick = function(){
alert(oDiv.innerHTML); // oDiv ;
};
oDiv = null; // ;
}
box();
// box() , oDiv ;
// ,oDiv 1; ;
// PS: , ;
5ブロックレベルのスコープを模倣する(匿名関数を定義し、直ちに呼び出す)
// JS ;
// (for /if ) , ;
function box(count){
for(var i=0; i count=2; i=2 , i=2;
console.log(i); // =>2; i for ;
}
box(2);
function box(count){
for(var i=0; i[1,2,3,4]; box ;
})(); // ;
console.log(box); // =>box is not defined;
// ;
// , ;
六プライベート変数
// JavaScript ; ;
// : , , ;
// / ;
function box(){
var age = 100; // , ;
}
// , ;
// , ; ;
function Box(){ // ;
var age = 100; // ;
function run(){ // ;
return ' ...';
};
this.get = function(){ // ;
return age+run(); // ;
};
}
var box = new Box();
console.log(box.get());
//
function Person(name){
var user = name; // ;
this.getUser = function(){
return user;
};
this.setUser = function(name){
user = name;
}
}
var p = new Person('Lee');
console.log(p.getUser()); // =>Lee;
console.log(p.setUser('Jack'));
console.log(p.getUser()); // =>Jack;
// , ; ;
静的プライベート変数
// ( ) , ;
(function(){ // ;
var age = 100; // ;
function run(){
return ' ...';
};
Box = function(){}; // ;
Box.prototype.go = function(){ // ( ) ; ;
return age+run();
};
})();
var box = new Box();
console.log(box.go()); // 100 ...;
// , Box = function(){} functiong Box(){}; Box var
// : , ; ,Box , ;
// , , , ;
(function(){
var user = "";
Person = function(value){ // Person ;
user = value; // name;
};
Person.prototype.getUser = function(){
return user;
};
Person.prototype.setUser = function(value){
user = value;
}
})();
var person = new Person();
person.setUser('Lee');
console.log(person.getUser()); // =>Lee;
// prototype , user ;
// : ;?
8モジュールモード
// , , , ;
// ;
// ;
var box = { // , : ;
age:100, // , ;
run:function(){
return ' ...';
};
};
// :
var box = function(){
var age = 100;
function run(){
return ' ...';
}
return { // ;
go:function(){ // ;
return age+run(); // , ;
}
}; // , ;
}();
// , ;
// , :
var box = function(){
var age = 100;
function run(){
return ' ...';
}
var obj = { // ;
go:function(){
return age+run();
}
};
return obj; // ;
}();
// , ;
// , ;
// : , ;
function Desk(){};
var box = function(){
var age = 100;
function run(){
return ' ...';
};
var desk = new Desk();
desk.go = function(){
return age+run();
};
return desk;
}();
console.log(box.go()); // =>100 ;
九合目JavaScriptプログラミングにおいて、関数式は非常に有用な技術である.関数式を使うと、関数に名前を付ける必要がなく、動的プログラミングが可能です.
1.関数式
関数宣言とは異なる関数式.関数宣言には名前が必要ですが、関数式は必要ありません.名前のない関数表現を匿名関数と呼びます.2.クローズドは、関数の内部に他の関数を定義すると、クローズドパケットを作成します.クローズドは、関数の内部を含むすべての変数にアクセスする権利があります.原理は以下の通りである.バックグラウンド実行環境において、クローズドの役割ドメインチェーンは、自身の役割領域、関数を含む作用領域、およびグローバル作用領域を含む.通常、関数のスコープおよびそのすべての変数は関数実行終了後に破壊されます.しかし、関数がクローズドバックに戻った時、この関数のスコープはメモリに存在しなくなるまで保存されます.3.ブロックレベルの作用領域は、クローズドパケットを使用して、JavaScriptでブロックレベルの作用領域を模倣することができる(JavaScript自体はブロックレベルの作用領域の概念がない).要点下記のように、関数を作成し、直ちに呼び出します.コードを実行することもできますし、メモリにその関数への参照を残しません.結果として、関数内部のすべての変数は直ちに破壊されます.作用領域(すなわち外部作用領域)を含む変数に特定の変数の割り当て値を与えない限り、4.プライベート変数のクローズドは、オブジェクト内でプライベート変数を作成するためにも使用できます.ポイントは、JavaScriptに真のプライベートオブジェクト属性の概念がないとしても、クローズドを使用して公開方法を実現することができ、公有法により、作用領域に定義された変数にアクセスすることができます.コンストラクターモード、プロトタイプパターンを使用して、ユーザー定義型の特権的な方法を実現することができます.モジュールモードを使用して、単例の特権的な方法を実現することもできます.