各JSエンジンによるFunction.prototype.applyの2番目のパラメータの実現差異


各functionには、2つの機能があります.1、functionの実行コンテキストを変更する(最初のパラメータはnullではなく、undefinedなど)2、Fnctionを実行/呼び出します.http://snandy.iteye.com/blog/420000 )apply方法の第二のパラメータは、行列として実現されると思われます.古典的な「javascript権威ガイド-第五版」を参照してください.中章8.6.4,145ページの一節:
「javascript権威の手引き」は書いています.
「apply()メソッドはcall()メソッドと似ています.関数に渡すパラメータは配列で指定されています.」
 
と641ページのFuntions.applyについては、argsは1つの配列として言及されています.
権威の手引きの中でこの言い方はあまり厳格でなくて、甚だしきに至っては自家撞着です.applyの2番目のパラメータはargmentsであり得るが、argmentsは配列ではないからである.アーグメンントについては、権威ガイドの章8.2.2に配列されていません.次はそれぞれテストします.
function fun1(a){alert(a)}

fun1.apply(null,[1,2,3]);//        

function fun2(){
	fun1.apply(null,arguments);//      arguments, arguments    
}
fun2('test');
 
 
すべてのブラウザでテストはエラーが発生していません.2回目のポップアップ情報ボックスは、最初のappyに転送されるのは配列で、2回目のはargmentsオブジェクトで、argmentsは配列ではありません.これは擬似配列です.
また、アーグメンツはアーグメンントの例ではなく、あるいはアーグメンントのコンストラクタがアーグメンントではないという点には疑問がある.何ですか?自分でテストしてもいいです.
 
間違ったテストをして、appyに伝える二つ目のパラメータは普通のオブジェクトです.実際には、2番目のパラメータが配列やargmentsではない場合、一部のブラウザ関連開発ツールはエラーを報告します.例えば:
function fun(){
	alert(arguments[0]);
}

fun.apply(null,{name:'john'});
 
IE 8:ArayまたはargmentsオブジェクトFirefox 3.6.3が不足しています.second argment to Function.prototype.applymust be an array Chrome 5.0.37.29 dev:  Function.prototype.appy:Agments list has wrong type Safari 4.0.3:  Result of expression'.appy'[[object Object]]is not a valid argment for'Function.prototype.appy'.
 
ここで、IEの明示的な提示要求は、appyの第二のパラメータは、Arayまたはargmentsであり、Firefox/Chrome/Safariは明確ではないが、実際には、それらは、第二のパラメータをargmentsとすることができる.ここでは、すべてのブラウザが暗黙の了解に達しているようです.
 
argmentsは擬似配列であり、他の擬似配列(HTMLCollection、NodeListなど)もapplyのパラメータとして使えますか?


 
  
	window.onload = function(){		
		var divs = document.getElementsByTagName('div');
		var chis = document.body.children;

		function fun(){
			alert(arguments[0]);
		}

		fun.apply(null,divs);
		//fun.apply(null,chis);
	}
  
 
 
	

First Child

 

 

divs chis,IE/Firefox/Chrome/Safari , 。 ,Opera 。 Opera apply ,arguments, 。

 

IE/Firefox/Chrome/Safari arguments, apply ? :

var obj = {0:'zero',1:'one',length:2}
function fun(){
	alert(arguments[0]);
}
fun.apply(null,obj);
 
Operaを いて、 のブラウザはまだ できません.
 
いて、 は のconstructorをアラーに します.
var obj = {0:'zero',1:'one',length:2,constructor:Array}
function fun(){
	alert(arguments[0]);
}
fun.apply(null,obj);

 
Operaが に しているほか、IE/Firefox/Chrome/Safariをだませないのは、Operaだけが っているように える.
 
 
 

<div id=「right-1」class=「col-lg-12 col-sm-4 col-xs-4 ad」


<div id=「right-2」class=「col-lg-12 col-sm-4 col-xs-4 ad」


<div id=「right-3」class=「col-lg-12 col-sm-4 col-xs-4 ad」