js函数参数和函数体内的再次声明不一样,原因是啥?

var x = 1;

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

foo() // 3

函数参数x,和var x中的x说是不一样,谁帮忙解释一下,原因或者是原理?(代码是es6写法)

以下是原出处,阮一峰的es6教程

![图片描述][1]

阅读 4.3k
3 个回答

找到正解,分享给大家

图片描述

谁说不一样?
就是一样。这里y是个默认参数,你应该知道,不管他。原函数类似:

function foo(x) {
  var x = 3;
  console.log(x);
}

变量声明会被前置

function foo(x) {
  var x;
  x = 3;
  console.log(x);
}

但是var声明的变量遇到冲突的时候是会被忽略的。因为参数叫x这里var x就相当于没有。
怎么会不一样呢?

这句话说的是
fucntion () { x = 2;} 里面的 x 和 var x = 3 的 x 不是一个 x。
这个例子主要说明,当函数默认参数中定义匿名函数的时候,相当于在外层定义的这个函数,而不是在函数体中定义了这个函数。

前者由于没有var 所以这个 x 是全局变量,后者是局部变量。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题
宣传栏