欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入解析JavaScript中的arguments對(duì)象

 更新時(shí)間:2016年06月12日 15:06:05   作者:雨打浮萍  
arguments是JavaScript里的一個(gè)內(nèi)置對(duì)象,像數(shù)組結(jié)構(gòu)一樣存儲(chǔ)參數(shù)的傳遞,這里我們就來(lái)深入解析JavaScript中的arguments對(duì)象,需要的朋友可以參考下

arguments定義

所有的函數(shù)都有一個(gè)自己的arguments對(duì)象,用來(lái)儲(chǔ)存它實(shí)際接受到的參數(shù),而不局限于函數(shù)聲明時(shí)所定義的參數(shù)列表。它不是數(shù)組卻類似數(shù)組,具有數(shù)組一樣的訪問(wèn)性質(zhì)及方式,可以由arguments[n]來(lái)訪問(wèn)對(duì)應(yīng)的單個(gè)參數(shù)的值,并擁有數(shù)組長(zhǎng)度屬性length。但是卻不具有數(shù)組的一些方法。可以通過(guò)call把a(bǔ)rguments轉(zhuǎn)化成真正的數(shù)組,然后進(jìn)行數(shù)組的操作。

var args = Array.prototype.slice.call(arguments);

類數(shù)組

1. 判斷ARGUMENTS是不是數(shù)組

alert(arguments instanceof Array);
alert(arguments instanceof Object);

2. 如何嚴(yán)格的判斷一個(gè)數(shù)據(jù)是數(shù)組(ARRAY)類的實(shí)例

function isArray(value){
  if (typeof Array.isArray === "function") {
    return Array.isArray(value);
  }else{
    return Object.prototype.toString.call(value) === "[object Array]";
  }
}

3. 把ARGUMENTS轉(zhuǎn)換成數(shù)組
方法一:內(nèi)置的類型可以通過(guò)prototype找到內(nèi)置的屬性方法,Array.prototype.slice就是訪問(wèn)Array的內(nèi)置方法slice。通過(guò)slice方法,返回一個(gè)數(shù)組。call是調(diào)用一個(gè)對(duì)象的方法,以另外一個(gè)對(duì)象替換當(dāng)前對(duì)象。

var arg = Array.prototype.slice.call(arguments,0);

方法二:比方法一性能要差一點(diǎn),因?yàn)樗窍葎?chuàng)建一個(gè)數(shù)組,然后再進(jìn)行的

var arg = [].slice.call(arguments,0);

方法三:通過(guò)循環(huán)轉(zhuǎn)變成數(shù)組

function toArray(arguments){
  var a = [];
  for(var i=0;i<arguments.length;i++){
    a.unshift(arguments.[i]);
  }
  return a;
}

caller

當(dāng)一個(gè)函數(shù)被另一個(gè)函數(shù)調(diào)用的時(shí)候,被調(diào)用的函數(shù)會(huì)自動(dòng)生成一個(gè)caller屬性,指向調(diào)用它的函數(shù)對(duì)象,如果函數(shù)未被調(diào)用,則caller為null。

function testCaller() {
  var caller = testCaller.caller;
  alert(caller);
}
function aCaller() {
  testCaller();
}
aCaller();

彈出的是函數(shù)aCaller的內(nèi)容。

arguments.callee
arguments.callee指向正在運(yùn)行的函數(shù)自身,返回正被執(zhí)行的 Function 對(duì)象,也就是所指定的 Function 對(duì)象的正文。
注意:arguments.length是實(shí)參長(zhǎng)度,arguments.callee.length是形參長(zhǎng)度,通常用來(lái)判斷形參與實(shí)參長(zhǎng)度是否一致
通過(guò)arguments獲得函數(shù)的實(shí)參,通過(guò)arguments.callee獲得函數(shù)的形參。
在閉包中應(yīng)用的也比較廣泛。

var i = 0;

  function b(num) {

    if (num < 10) {

      num++;

      i++;

      //如果有參數(shù),callee也要把參數(shù)帶上;

      arguments.callee(num);

    } else {

      //輸出2次

      alert("調(diào)用了"+i+"次callee!");

    }

  }

  b(8);

 Arguments.callee在閉包中的應(yīng)用,它提供了一種遞歸調(diào)調(diào)用的功能。

//用arguments.callee計(jì)算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));

例:callee求1-n的和

function fn(n){
  if(n==1) return n;
  else return n+arguments.callee(n-1);
}

它可以讓一個(gè)匿名函數(shù)自己調(diào)用自己

例:

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結(jié)果是[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)

在預(yù)解釋的時(shí)候,function fn(){}(1);會(huì)被分開(kāi)處理,分成兩個(gè)函數(shù),第一個(gè)是function fn() {},而第二個(gè)則為匿名函數(shù):(1)。如果第二個(gè)不帶參數(shù),就會(huì)報(bào)錯(cuò),但是上面的函數(shù)包含在一個(gè)()里面,則是正確的。

(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);

相關(guān)文章

最新評(píng)論