JavaScriptを理解するcaler,call,call,appy

5502 ワード

まず、javascriptの関数に含まれるパラメータについて話したいです.
Agments
オブジェクトは、実行中の関数とその関数を呼び出すパラメータを表します.
[function.]argments[n]
パラメータfunction:オプションです.現在実行中のFunctionオブジェクトの名前.n:オプション.Functionオブジェクトに渡す0からのパラメータ値インデックスです.
説明
Agmentsは関数コールを行う場合、指定されたパラメータの他に作成された隠しオブジェクトです.Agmentsは配列のようなアクセス特性と方式を持っているので、argments[n]によって対応する単一パラメータの値にアクセスでき、配列長属性lengthを持っているという配列のようなオブジェクトではない.また、argmentsオブジェクトは、関数宣言によって定義されたパラメータリストに限定されず、実際に関数に伝達されるパラメータを格納し、argmentsオブジェクトを明示的に作成することができません.アーグメンントオブジェクトは関数の開始時のみ使用できます.これらの性質を以下の例で詳しく説明します.
 
  
//arguments 。
function ArgTest(a, b){
var i, s = "The ArgTest function expected ";
var numargs = arguments.length; // 。
var expargs = ArgTest.length; // 。
if (expargs < 2)
s += expargs + " argument. ";
else
s += expargs + " arguments. ";
if (numargs < 2)
s += numargs + " was passed.";
else
s += numargs + " were passed.";
s += "

"
for (i =0 ; i < numargs; i++){ // 。
s += " Arg " + i + " = " + arguments[i] + "
";
}
return(s); // 。
}
ここには、アーグメンントが配列ではないことを示すコードが追加されています.
 
  
Array.prototype.selfvalue = 1;
alert(new Array().selfvalue);
function testAguments(){
alert(arguments.selfvalue);
}
実行コードは、最初のalertが1を示しています.これは配列オブジェクトがselfvalue属性を持っていることを表しています.値は1です.関数testAggamentsを呼び出したときに、「undefined」と表示されていることが分かります.アーグメンツの属性ではなく、つまり、アーグメンツは配列オブジェクトではありません.
caler
関数の参照を返します.関数は現在の関数を呼び出します.
functionName.caller
functionNameオブジェクトは実行関数の名前です.
説明
関数では、caler属性は関数実行時のみ定義されます.関数がトップレベルで呼び出された場合、calerに含まれるのはnullです.文字列コンテキストでcaler属性を使用すると、結果はfunctionName.toStringと同じで、つまり関数の逆コンパイルテキストが表示されます.
以下の例では、caler属性の使い方を説明します.
 
  
// caller demo {
function callerDemo() {
if (callerDemo.caller) {
var a= callerDemo.caller.toString();
alert(a);
} else {
alert("this is a top function");
}
}
function handleCaller() {
callerDemo();
}
calee
実行中のFunctionオブジェクト、すなわち指定されたFunctionオブジェクトの本文を返します.
[function.]argments.calee
オプションfunctionパラメータは、現在実行中のFunctionオブジェクトの名前です.
説明
calee属性の初期値は、実行中のFunctionオブジェクトです.
calee属性は、アーグメンントオブジェクトのメンバーであり、関数オブジェクト自体への参照を表しています.これは匿名に有利です.
関数の再帰性または保証関数のパッケージ性、例えば以下の例の再帰的計算1〜nの自然数の和.この属性
相関関数が実行されている場合にのみ使用できます.また注意したいのは、length属性を持つcaleeです.この属性は時々
検証に使うのがいいです.argments.lengthは実参長で、argments.callee.lengthは
イメージの長さは、呼び出し時のイメージの長さと実際のパラメータの長さが一致するかどうかを判断することができます.
 
  
//callee
function calleeDemo() {
alert(arguments.callee);
}
//
function calleeLengthDemo(arg1, arg2) {
if (arguments.length==arguments.callee.length) {
window.alert(" !");
return;
} else {
alert(" :" +arguments.length);
alert(" : " +arguments.callee.length);
}
}
//
var sum = function(n){
if (n <= 0)
return 1;
else
return n +arguments.callee(n - 1)
}
一般的な再帰関数を比較:
var sum=function(n){
if(1=n)return 1;
else return n+sum(n-1)
呼び出し時:alert(sum(100);
関数の内部にはsum自身への参照が含まれています.関数名は変数名だけで、関数内部でsumを呼び出します.すなわち呼び出しに相当します.
グローバル変数は、自分自身を呼び出すということをうまく表現できないので、caleeを使うのが良い方法です.
apply and call
それらの役割は、関数を別のオブジェクトに結びつけて実行することであり、両者はパラメータの定義の仕方だけで違いがあります.
apply(thisArg,argAray)
call(thisArg[,arg 1,arg 2…])
つまり、すべての関数の内部のthisポインタは、他のオブジェクトとして機能を実行するための方法として、thisArgとして与えられます.
アプリの説明
もしargArayが有効な配列ではないか、またはargmentsオブジェクトではないなら、TypeErrorを引き起こすことになります.
argArayとthisArgのいずれかのパラメータが提供されていない場合、GlobalオブジェクトはthisArgとして使用され、
そして、どのパラメータも渡されませんでした.
コールの説明
call方法は、関数のオブジェクトコンテキストを初期のコンテキストから、thisArgによって指定された新しいオブジェクトに変更することができる.
thisArgパラメータが提供されていない場合、GlobalオブジェクトはthisArgとして使用される.
関連技術:
callとappyを応用してもう一つの関数をcallとappyで応用した後、現在の技術があります.
関数(クラス)は、他の関数(クラス)の方法または属性を備えています.これを「継承」ともいいます.以下の例を見てください.
 
  
//
function base() {
this.member = " dnnsun_Member";
this.method = function() {
window.alert(this.member);
}
}
function extend() {
base.call(this);
window.alert(member);
window.alert(this.method);
}
上記の例では、コールした後、extedはベースの方法と属性を継承することができます.
ちなみに、javascriptフレームワークprototypeでは、appyを使って定義タイプのパターンを作成します.
実は現代のサイズは以下の通りです.
 
  
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
解析:コードから見ると、オブジェクトは一つの方法しか含まれていません.Createは関数、すなわちクラスを返します.これも同じクラスです.
コンストラクタは、initializeを呼び出すが、この方法はクラス作成時に定義される初期化関数である.
プロトタイプのクラス作成モードを実現できます.
例:
 
  
var vehicle=Class.create();
vehicle.prototype={
initialize:function(type){
this.type=type;
}
showSelf:function(){
alert("this vehicle is "+ this.type);
}
}
var moto=new vehicle("Moto");
moto.showSelf();