国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

javascript - ES6中函數(shù)參數(shù)預設(shè)值為函數(shù)的問題?
阿神
阿神 2017-07-05 11:09:13
0
4
1461

我對函數(shù)參數(shù)預設(shè)值為函數(shù)的情況有許多困惑
例如

let foo = 'outer';

function bar(func = x => foo) {
  let foo = 'inner';
  console.log(func()); 
}

bar(); //outer

根據(jù)阮一峰的es6入門,我知道函數(shù)參數(shù)是預設(shè)值的話,會先有個區(qū)塊級作用域包裹參數(shù),初始化結(jié)束後區(qū)塊級作用域消失

一旦設(shè)定了參數(shù)的預設(shè)值,當函數(shù)進行宣告初始化時,參數(shù)會形成一個單獨的作用域(context)。等到初始化結(jié)束,這個作用域就會消失。這種語法行為,在不設(shè)定參數(shù)預設(shè)值時,是不會出現(xiàn)的。

如果預設(shè)值是普通變數(shù)我能理解,但還是不懂為什麼這裡輸出的是outer而不是inner

阿神
阿神

閉關(guān)修行中......

全部回覆(4)
曾經(jīng)蠟筆沒有小新

一句話:函數(shù)的閉包在定義時形成,而非運行時。

給我你的懷抱

把語法糖徹底展開,應該能看清楚點

let foo = 'outer';

function fk_compiler() {
  return foo;
}

function bar(func) {
  if (func === undefined) {
    func = fk_compiler;
  }
  let foo = 'inner';
  console.log(func());
}

bar();

你看,fk_compiler裡是不是只能回到外部作用域下的foo?

習慣沉默

js是詞法作用域,foo值取函數(shù)定義時的值而不是執(zhí)行時的值。

給我你的懷抱

基於回覆者的代碼:

let foo = 'outer';

function fk_compiler() {
  return foo;
}

function bar(func) {
  if (func === undefined) {
    func = fk_compiler;
  }
  let foo = 'inner';
  console.log(func());
}

bar();

js採取的是詞法作用域,所以,無論函數(shù)在哪裡被調(diào)用,或者以任何形式被調(diào)用,其詞法作用域只由其被聲明時的位置決定。

fk_compiler被聲明的作用域在全局,所以,它會去訪問全局作用域中的foo。答案也就出來了。

類似碼:

function foo(){
  console.log(this.a);
}
(function init(){
  var a = 'inner';//此處改為 window.a = 'global';再試試
  foo();
})();
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板