第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

遞歸調(diào)用javascript函數(shù)

遞歸調(diào)用javascript函數(shù)

千萬里不及你 2019-11-23 10:59:21
我可以在這樣的變量中創(chuàng)建遞歸函數(shù):/* Count down to 0 recursively. */var functionHolder = function (counter) {    output(counter);    if (counter > 0) {        functionHolder(counter-1);    }}這樣,functionHolder(3);將輸出3 2 1 0。假設(shè)我做了以下事情:var copyFunction = functionHolder;copyFunction(3);將輸出3 2 1 0如上。如果再更改functionHolder如下:functionHolder = function(whatever) {    output("Stop counting!");然后functionHolder(3);將給出Stop counting!,如預(yù)期的那樣。copyFunction(3);現(xiàn)在給出3 Stop counting!它所指的functionHolder,而不是函數(shù)(它本身指向的)。在某些情況下這可能是理想的,但是有沒有一種方法可以編寫函數(shù),以便它調(diào)用自身而不是保存它的變量?也就是說,是否可以僅更改線路,functionHolder(counter-1);以便3 2 1 0在調(diào)用時仍能完成所有這些步驟copyFunction(3);?我試過了,this(counter-1);但這給了我錯誤this is not a function。
查看完整描述

3 回答

?
心有法竹

TA貢獻1866條經(jīng)驗 獲得超5個贊

使用命名函數(shù)表達式:

您可以為函數(shù)表達式指定一個實際上是私有的名稱,并且只有在函數(shù)內(nèi)部才能看到:


var factorial = function myself (n) {

    if (n <= 1) {

        return 1;

    }

    return n * myself(n-1);

}

typeof myself === 'undefined'

下面myself是該函數(shù)的可見里面只有自己。


您可以使用此私有名稱來遞歸調(diào)用該函數(shù)。


請參閱13. Function DefinitionECMAScript 5規(guī)范:


可以從FunctionExpression的FunctionBody內(nèi)部引用FunctionExpression中的標(biāo)識符,以允許該函數(shù)以遞歸方式調(diào)用自身。但是,與FunctionDeclaration中的功能不同,F(xiàn)unctionExpression中的Identifier不能從中引用,也不會影響包圍FunctionExpression的作用域。


請注意,版本8之前的Internet Explorer的行為不正確,因為該名稱實際上在封閉的變量環(huán)境中可見,并且它引用了實際功能的副本(請參見下面的patrick dw的注釋)。


使用arguments.callee:

或者,您可以arguments.callee用來引用當(dāng)前函數(shù):


var factorial = function (n) {

    if (n <= 1) {

        return 1;

    }

    return n * arguments.callee(n-1);

}

ECMAScript的第五版禁止在嚴(yán)格模式下使用arguments.callee(),但是:


(來自MDN):在常規(guī)代碼中arguments.callee指的是封閉函數(shù)。這個用例很弱:只需命名封閉函數(shù)即可!而且,arguments.callee實質(zhì)上阻礙了諸如內(nèi)聯(lián)函數(shù)之類的優(yōu)化,因為如果訪問arguments.callee,則必須使其能夠提供對未內(nèi)聯(lián)函數(shù)的引用。嚴(yán)格模式功能的arguments.callee是不可刪除的屬性,在設(shè)置或檢索時會拋出該屬性。


查看完整回答
反對 回復(fù) 2019-11-23
?
忽然笑

TA貢獻1806條經(jīng)驗 獲得超5個贊

您可以使用arguments.callee [MDN]來訪問函數(shù)本身:


if (counter>0) {

    arguments.callee(counter-1);

}

但是,這將在嚴(yán)格模式下中斷。


查看完整回答
反對 回復(fù) 2019-11-23
?
隔江千里

TA貢獻1906條經(jīng)驗 獲得超10個贊

您可以使用Y-combinator:(Wikipedia)


// ES5 syntax

var Y = function Y(a) {

  return (function (a) {

    return a(a);

  })(function (b) {

    return a(function (a) {

      return b(b)(a);

    });

  });

};


// ES6 syntax

const Y = a=>(a=>a(a))(b=>a(a=>b(b)(a)));


// If the function accepts more than one parameter:

const Y = a=>(a=>a(a))(b=>a((...a)=>b(b)(...a)));

您可以這樣使用它:


// ES5

var fn = Y(function(fn) {

  return function(counter) {

    console.log(counter);

    if (counter > 0) {

      fn(counter - 1);

    }

  }

});


// ES6

const fn = Y(fn => counter => {

  console.log(counter);

  if (counter > 0) {

    fn(counter - 1);

  }

});


查看完整回答
反對 回復(fù) 2019-11-23
  • 3 回答
  • 0 關(guān)注
  • 323 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號