JavaScript の引数オブ​​ジェクトの詳細な分析

高洛峰
リリース: 2017-01-04 17:07:56
オリジナル
1211 人が閲覧しました

引数の定義

すべての関数には独自の引数オブ​​ジェクトがあり、これは受け取る実際のパラメータを格納するために使用され、関数の宣言時に定義されたパラメータ リストに限定されません。これは配列ではありませんが、配列と同様のアクセス プロパティとメソッドを持ち、対応する単一パラメータの値には argument[n] を通じてアクセスでき、配列長属性 length を持ちます。ただし、配列のメソッドがいくつかありません。呼び出しを通じて引数を実配列に変換し、配列操作を実行できます。

var args = Array.prototype.slice.call(arguments);
ログイン後にコピー

配列クラス

1. ARGUMENTSが配列であるかどうかを判定する

alert(arguments instanceof Array);
alert(arguments instanceof Object);
ログイン後にコピー

2. データが配列(ARRAY)クラスのインスタンスであるかどうかを厳密に判定する方法

function isArray(value){
  if (typeof Array.isArray === "function") {
    return Array.isArray(value);
  }else{
    return Object.prototype.toString.call(value) === "[object Array]";
  }
}
ログイン後にコピー

3. ARGUMENTSを配列に変換する
方法1. : 組み込み型 Array.prototype.slice は、Array にアクセスするための組み込みメソッドのスライスです。スライスメソッドを通じて、配列が返されます。 call は、オブジェクトを呼び出して現在のオブジェクトを別のオブジェクトに置き換えるメソッドです。

var arg = Array.prototype.slice.call(arguments,0);
ログイン後にコピー

方法2: 最初に配列を作成してから処理を進めるため、方法1より少しパフォーマンスが悪くなります

var arg = [].slice.call(arguments,0);
ログイン後にコピー

方法3: ループを通して配列に変換する

function toArray(arguments){
  var a = [];
  for(var i=0;i<arguments.length;i++){
    a.unshift(arguments.[i]);
  }
  return a;
}
ログイン後にコピー

caller

関数が呼び出されたとき別の関数によって呼び出される場合、呼び出された関数は、それを呼び出した関数オブジェクトを指す caller 属性を自動的に生成します。関数が呼び出されなかった場合、caller は null になります。

function testCaller() {
  var caller = testCaller.caller;
  alert(caller);
}
function aCaller() {
  testCaller();
}
aCaller();
ログイン後にコピー

ポップアップされるのは、関数 aCaller の内容です。

arguments.callee
arguments.callee は、実行中の関数自体を指し、指定された Function オブジェクトの本体である実行中の Function オブジェクトを返します。
注: argument.length は実際のパラメータの長さ、arguments.callee.length は仮パラメータの長さで、通常、仮パラメータの長さが一貫しているかどうかを判断するために使用されます。
関数の実際のパラメータを取得します。引数を介して関数の仮パラメータを取得し、 argument.callee を介して関数を取得します。
クロージャーにも広く使用されています。

var i = 0;
 
  function b(num) {
 
    if (num < 10) {
 
      num++;
 
      i++;
 
      //如果有参数,callee也要把参数带上;
 
      arguments.callee(num);
 
    } else {
 
      //输出2次
 
      alert("调用了"+i+"次callee!");
 
    }
 
  }
 
  b(8);
 
 Arguments.callee在闭包中的应用,它提供了一种递归调调用的功能。
 
//用arguments.callee计算10的阶乘,例如: 1×2×3×4×5×6×7....
 
  function c(x) {
 
    return x > 1 ? x * arguments.callee(x - 1) : 1
 
  } (10);
 
  //输出6
 
  alert(c(3));
 
  //输出3628800
 
  alert(c(10));
ログイン後にコピー

例: 呼び出し先は 1-n の合計を見つけます

function fn(n){
  if(n==1) return n;
  else return n+arguments.callee(n-1);
}
ログイン後にコピー

これにより、匿名関数が自分自身を呼び出すことができます

例:

function list(type){
  var result = "<"+type+"l><li>";
  var args = Array.prototype.slice.call(arguments,1);
  result += args.join("</li><li>");
  result += "</li></"+type+"l>";
  return result;
}
var listHtml = list("o","one","two");
console.log(listHtml);
ログイン後にコピー

例 2: インタビューの質問: 次の console.log の結果は [1,2,3 です] 、4】は?

function foo(x){
  console.log(arguments);
  return x;
}
foo(1,2,3,4);
function foo(x){
  console.log(arguments);
  return x;
}(1,2,3,4)
ログイン後にコピー

事前解釈中、関数 fn(){}(1); は個別に処理され、2 つの関数に分割されます。1 つ目は関数 fn() {} で、2 つ目は匿名関数です: ( 1)。 2 番目の関数がパラメーターを受け取らない場合はエラーが報告されますが、上記の関数が () に含まれていれば正しいです。

(function fn(){
  console.log(arguments);
}(1,2,3,4));
(function foo(x){
  console.log( arguments);
  return x;
})(1,2,3,4)
function foo(){
  bar.apply(null,arguments);
}
function bar(x){
  console.log(arguments);
}
foo(1,2,3,4);
ログイン後にコピー


JavaScript 関連記事の引数オブ​​ジェクトのより詳細な分析については、PHP 中国語 Web サイトに注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート