argmentsとAray.prototype.slice.cal(argments,0)
2556 ワード
下記のエラーコードは、argmentsが本物の配列ではないことが原因です.したがって、直接forEachではなく、argmentsを行列に変換することができます.
function useArgments(){
var sum=0 argments.forEach(function(e) sum+=e; }); //for(var i=0;i) // sum=sum+argments[i] //} return sum;'var s=useArgments(1,2,3,4)
consolie.log(s)
または
function useArgments(){ var sum=0 var args=Aray.prototype.slice.cal(argments,0) args.forEach(function(e) sum+=e; }); return sum;
var s=useArgments(1,2,3,4)
テーマの説明
関数calItを実現し、呼び出し後に下記の条件を満たす.
1、戻りの結果は、fnを呼び出した後の結果です.
2、fnの呼び出しパラメータはコールItのものです.
最初のパラメータの後のすべてのパラメータ
入力例:
var a. = 1; var b = 2. var test = 機能 (ファースト、 second) { return ファースト === a. && second === b;;;; calIt(test、 a, b):
function calIt(fn){ var args=Aray.prototype.slice.cal(argments,1) var s=fn.apply(null,args) return;
)
argmentsは本物の配列オブジェクトではなく、配列と似ているだけなので、sliceという方法はありません.一方、Aray.prototype.slice.call(argments,1)はargmentsを一つの配列オブジェクトに変換して、argmentsにslice()の方法を持たせると理解できます.
直接argments.slice(1)を書くとエラーが発生します.
Aray.prototype.slice.calはlength属性を持つオブジェクトを配列に変換することができる.
Aray.prototype.slice.cal.slice(1)
多くの例で上記の呼び出しを見ましたが、長い間見ても意味が分かりませんでした.最近検討してみたら、やっと分かりました.
このような呼び方を議論するには、目的が一つしかない.
argments(typeof argmentsはobject)で、ここで呼び出したのはarrayのslice方法です.
array.prototype.sliceはプロトタイプslice方法であり、
call()ヘルプドキュメントを見ると、callを現在のコンテキストとして使うことができます.(簡単なthisObjectでもArayを呼び出すことができます.)
slice()は配列の一部を返します.Aray.prototype.slice.cal(argments,0)/パラメータを真の配列に変換する callの役割はthisの指向を変えることです.argmentsの呼び出しに相当します.sliceという方法です.0はstart=0です.endは指定されていません.だから全体のargmentsに戻ります.この時は配列に変換します.
ここに問題があります.argments.slice(0)//なぜ直接的ではないのか、callでthisの指向を変えなければならないのか?以下の分析を参照してください. 引用:slice方法が使えるのは、length属性があればいいです.argmentsはlength属性がありますが、slice方法がありません.だから、array.prototype.slice()が実行される時、Aray.prototypeは既にcallによってargmentsに変更されました.sliceの実行条件を満たしていますので、エラーhackという感じはありません.
function useArgments(){
var sum=0 argments.forEach(function(e) sum+=e; }); //for(var i=0;i) // sum=sum+argments[i] //} return sum;'var s=useArgments(1,2,3,4)
consolie.log(s)
または
function useArgments(){ var sum=0 var args=Aray.prototype.slice.cal(argments,0) args.forEach(function(e) sum+=e; }); return sum;
var s=useArgments(1,2,3,4)
テーマの説明
関数calItを実現し、呼び出し後に下記の条件を満たす.
1、戻りの結果は、fnを呼び出した後の結果です.
2、fnの呼び出しパラメータはコールItのものです.
最初のパラメータの後のすべてのパラメータ
入力例:
var a. = 1; var b = 2. var test = 機能 (ファースト、 second) { return ファースト === a. && second === b;;;; calIt(test、 a, b):
function calIt(fn){ var args=Aray.prototype.slice.cal(argments,1) var s=fn.apply(null,args) return;
)
function
callIt(fn) {
return
fn.apply(
this
・,[].slice.call(arguments,1));
}
Aray.prototype.slice.cal(argments,1)についての説明argmentsは本物の配列オブジェクトではなく、配列と似ているだけなので、sliceという方法はありません.一方、Aray.prototype.slice.call(argments,1)はargmentsを一つの配列オブジェクトに変換して、argmentsにslice()の方法を持たせると理解できます.
直接argments.slice(1)を書くとエラーが発生します.
Aray.prototype.slice.calはlength属性を持つオブジェクトを配列に変換することができる.
var a={length:3,0:'abc',1:'def',2:'ghi'};
console.log(Array.prototype.slice.call(a));// ["abc", "def",'ghi']
var a={length:0};
console.log(Array.prototype.slice.call(a));// []
var a={length:3};
consolie.log(Aray.prototype.slice.cal(a)); [undefined] undefined undefined]Aray.prototype.slice.cal.slice(1)
多くの例で上記の呼び出しを見ましたが、長い間見ても意味が分かりませんでした.最近検討してみたら、やっと分かりました.
このような呼び方を議論するには、目的が一つしかない.
argments(typeof argmentsはobject)で、ここで呼び出したのはarrayのslice方法です.
array.prototype.sliceはプロトタイプslice方法であり、
call()ヘルプドキュメントを見ると、callを現在のコンテキストとして使うことができます.(簡単なthisObjectでもArayを呼び出すことができます.)
slice()は配列の一部を返します.
ここに問題があります.