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;
)functioncallIt(fn) {    returnfn.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()は配列の一部を返します.
  • 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という感じはありません.