在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ ES6 參數(shù)默認(rèn)值為函數(shù),并在內(nèi)部進(jìn)行變量賦值

ES6 參數(shù)默認(rèn)值為函數(shù),并在內(nèi)部進(jìn)行變量賦值

var x = 1;
function foo(x, y = function() { x = 2; }) {
  var x = 3;
  y();
  console.log(x);
}

foo() // 3
x // 1

如果y賦值的函數(shù)是外部定義的話,最后的全局x為什么是 1
如果y賦值的函數(shù)是內(nèi)部定義的話,foo()為什么會打印 3

回答
編輯回答
夢若殤

代碼很有意思,不過實際項目中用到的可能不會太多。
其次 這不就是個閉包了么。
正如樓上提到的

2017年3月11日 01:03
編輯回答
拼未來

嗨,你的觀察是正確的。這個作用域既不是“外”也不是“內(nèi)”,而是夾在中間的作用域,這是為了防止默認(rèn)參數(shù)被函數(shù)內(nèi)部的變量污染。

2018年3月24日 08:58
編輯回答
初心

題主你需要好好了解一下 ES6 的函數(shù)參數(shù)默認(rèn)值。推薦一本書:《深入理解ES6》。

在 ES6 里,參數(shù)默認(rèn)值等效于直接展開:

function foo(x, y = 0) {....}
// =
function foo(x, y) {
  if (y === undefined) { y = 0 }
  ....
}

所以你的代碼就等效于:

var x = 1;
function foo(x, y) {
  var x = 3;
  if (y === undefined) {
    y = function() { x = 2; }
  }
  y();
  console.log(x);
}

foo() // 3
x // 1

因為你在函數(shù)內(nèi)部使用了 var x = 2;,所以 y() 操作的實際是閉包內(nèi)部的 x,所以不會影響到閉包外面的 x。

2017年8月18日 15:56