caler,call,call,appy


Javascript-全面的な理解caler、call、call、appy
Author:Blue Destiny,never-online From:http://www.never-online.netBlog.cdn.net/Blue Destiny
1、caller
JScript参照では、現在の関数を呼び出した関数の参照を返します。この話をどう理解するかは、まず簡単な例を挙げます。
// caller demo {
function callerDemo() {
	if (callerDemo.caller) {
		var a= callerDemo.caller.toString();
		alert(a);
	} else {
		alert("this is a top function");
	}
}
function handleCaller() {
	callerDemo();
}
  
上記の例では、呼び出しデータの参照を返すことがわかります。このようにして、Oclickがイベントをトリガするときは、常に匿名関数を有することが分かる。
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);
	}
}
		
上記の例から、caleeは実行関数、すなわち呼び出された関数を指すために用いられます。上記の例では、careeはプリントすることができます。もちろん他の用途もあります。また、length属性において、argments.lengthは実パラメータ長であり、argments.calengthはイメージ長であり、これにより、呼び出し時のモダリティ長さが実パラメータ長と一致するかどうかを判断することができる。
2、calee
JScriptは、実行中のFunctionオブジェクト、すなわち指定されたFunctionオブジェクトの本文を返します。注意したいのは、caleeはlength属性を持っています。これは時には検証に使うのがいいです。
3、callとappy
callメソッドJScript参照における説明:オブジェクトを呼び出す方法は、現在のオブジェクトを別のオブジェクトに置き換えます。call([thisObj],arg 1[,arg 2[,argN]]]]])はありませんが、例はありません。
applyメソッドJScript参照における説明:あるオブジェクトの一つの方法を適用して、別のオブジェクトで現在のオブジェクトを置換します。apply([thisObj[,argAray])
実際、この2つの役割はほぼ同じです。注意すべき点はcallのパラメータが配列となります。call、appyの具体的な応用を見てみます。
// simple call demo
function simpleCallDemo(arg) {
	window.alert(arg);
}
function handleSPC(arg) {
	simpleCallDemo.call(this, arg);
}
// simple apply demo
function simpleApplyDemo(arg) {
	window.alert(arg);
}
function handleSPA(arg) {
	simpleApplyDemo.apply(this, arguments);
}
	
上記の簡単な例から、callとappyは現在のパラメータを別の関数のパラメータに伝達して、別の関数のアプリケーションを呼び出します。時には実用的な方法です。もちろん、callまたはappy(パラメータまたは配列)を使って、実際の状況を見て決めます。
他のアプリケーションを見てみます。
callとappyは、もう一つの関数(クラス)をcallとappyで適用した後、現在の関数(クラス)は別の関数(クラス)の方法または属性を備えています。これは「継承」とも言えます。以下の例を見てください。
// inherit
function base() {
	this.member = "never-online";
	this.method = function() {
		window.alert(this.member);
	}
}
function extend() {
	base.call(this);
	window.alert(member);
	window.alert(this.method);
}
	
上記の例では、コールした後、extedはベースの方法と属性を継承することができます。
アプリをもう一つ見てください。
// advanced apply demo
function adApplyDemo(x) {
	return ("this is never-online, BlueDestiny '" + x + "' demo");
}
function handleAdApplyDemo(obj, fname, before) {
  var oldFunc = obj[fname];
  obj[fname] = function() {
    return oldFunc.apply(this, before(arguments));
  };
}
function hellowordFunc(args) {
  args[0] = "hello " + args[0];
  return args;
}
function applyBefore() {
	alert(adApplyDemo("world"));
}
function applyAfter() {
	handleAdApplyDemo(this, "adApplyDemo", hellowordFunc);
	alert(adApplyDemo("world")); // Hello world!
}
	
注意したいのは、まず「元のadAppleyDemo」ボタンをクリックして、「アプリケーション後のadAppleyDemo」ボタンをクリックすると、先にapplyメソッドを適用して、元の値が変更されます。もしかしたら、何か特別なことがあったのではないかという友達がいるかもしれません。ここで指定してください。左のボタンをクリックすると、左のボタンしかありません。「this is never-online、BlueDestiny'world'demo」は右のボタンを押すと、「this never-online、Blue Destiny'hello world'demo」という結果が出ます。左のボタンをクリックして、結果はどうなりますか?自分で試してみます。