javascript上級プログラムの設計03-関数式、クローズド、プライベート変数を読みます.
8527 ワード
一、関数宣言と関数式
関数の定義には、関数宣言と関数式があります.それらの間の重要な違いは関数の向上です.
1.関数宣言は関数アップグレードを行いますので、関数呼び出しの前にもエラーが発生しません.
再帰関数は、関数内部で自身を呼び出すことによって達成される.
①直接関数名を使って再帰的に呼び出します.
「use strict」を追加したらエラーが発生します.
クローズドは、別の関数のスコープ内の変数にアクセスできる関数です.閉じたパケットを作成する一般的な方法は、関数内で別の関数を作成することです.他の関数の内部で定義された関数は、外部関数の作用領域をその作用ドメインチェーンに追加します.
1.クローズドと変数
①クローズドは、関数内の任意の変数を含む最後の値しか取得できません.たとえば:
②匿名関数による改造:
2.クローズド中のthis
this変数は、動作時に環境バインディングを関数に基づいて実行します.
全体的な実行環境では、thisはwindowオブジェクトを指します.
関数をオブジェクトとする方法では、thisはそのオブジェクトに等しくなります.
匿名関数の実行は大域的であり、thisは一般にwindowオブジェクトを指す.
①閉包中のthisの例:
関数の定義には、関数宣言と関数式があります.それらの間の重要な違いは関数の向上です.
1.関数宣言は関数アップグレードを行いますので、関数呼び出しの前にもエラーが発生しません.
test();
function test(){
alert(1);
}
2.関数式は関数の昇格を行わず、関数が宣言される前に呼び出したらエラーが発生します.test(); // test is not a function
var test=function(){
alert(1);
}
二、再帰関数再帰関数は、関数内部で自身を呼び出すことによって達成される.
①直接関数名を使って再帰的に呼び出します.
function f(num){
if(num==1){
return 1;
}else{
return num*f(num-1);
}
}
console.log(f(4));//24
console.log(f(5));//120
この実現の欠点は,関数の内部に直接関数名を書き込んでしまうことである.下記の設定を行うとエラーが発生します.var test=f;
f=null;
console.log(test(3));// , f is not a function
②argments.caleeで解決すると、argments.caleeは実行中の関数を指すポインタです.このようにして上記の問題を避けました.function f(num){
if(num==1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
console.log(f(4));//24
console.log(f(5));//120
var test=f;
f=null;
console.log(test(3));//6
しかし、この方法にはもう一つの欠点があります.厳しいモードで失敗を実行するということです.「use strict」を追加したらエラーが発生します.
'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
③命名関数式を採用すると、厳密なモードで成功します."use strict";
var f=function t(num){
if(num==1){
return 1;
}else{
return num*t(num-1);
}
}
console.log(f(4));//24
console.log(f(5));//120
var test=f;
f=null;
console.log(test(3));//6
三、閉包するクローズドは、別の関数のスコープ内の変数にアクセスできる関数です.閉じたパケットを作成する一般的な方法は、関数内で別の関数を作成することです.他の関数の内部で定義された関数は、外部関数の作用領域をその作用ドメインチェーンに追加します.
1.クローズドと変数
①クローズドは、関数内の任意の変数を含む最後の値しか取得できません.たとえば:
function createFunctions(){
var result=new Array();
for(var i=0;i<10;i++){
result[i]=function(){
return i;
}
}
return result;
}
var result=createFunctions();
result[1]();//10
この方法は、着信1−10を呼び出しても結果は10であり、これは予期されていない.②匿名関数による改造:
function createFunctions(){
var result=new Array();
for(var i=0;i<10;i++){
result[i]=(function(num){
return num;
})(i);
}
return result;
}
var result=createFunctions();
result[2];//2
改造後の運行結果は私達の予想通りになりました.なぜならば、iをnumの命名パラメータに渡す時は値によって伝達されるからです.2.クローズド中のthis
this変数は、動作時に環境バインディングを関数に基づいて実行します.
全体的な実行環境では、thisはwindowオブジェクトを指します.
関数をオブジェクトとする方法では、thisはそのオブジェクトに等しくなります.
匿名関数の実行は大域的であり、thisは一般にwindowオブジェクトを指す.
①閉包中のthisの例:
var name='window';
var object={
name:"object",
getName:function(){
return function(){
return this.name;
}
}
};
object.getName()();//window
②まず、閉じた外部作用領域のthisを、一つの閉じたパケットがアクセスできる変数に保存します.これにより、閉じたパケットを対応するオブジェクトにアクセスすることができます.たとえば:var name='window';
var object={
name:"object",
getName:function(){
var that=this;
return function(){
return that.name;
}
}
};
object.getName()();//object