JavaScript中没有参数绑定

JavaScript中没有参数绑定,javascript,Javascript,有人能解释一下这个代码的行为吗 var arguments = 42; var arr = () => arguments; arr(); // 42 function foo() { var f = (i) => arguments[0] + i; // foo's implicit arguments binding return f(2); } foo(1); // 3 我知道什么是隐式参数绑定 我不明白的是foo(1)如何返回3 返回f(2)是

有人能解释一下这个代码的行为吗

var arguments = 42;
var arr = () => arguments;

arr(); // 42

function foo() {
  var f = (i) => arguments[0] + i; // foo's implicit arguments binding
  return f(2);
}

foo(1); // 3       
我知道什么是隐式参数绑定

  • 我不明白的是
    foo(1)
    如何返回3

  • 返回f(2)
    是什么?它在哪个函数中调用


PS:我正在关注Mozilla文档。

箭头函数不绑定
参数
,因此当您在
f
中使用
参数[0]
时,您正在访问
foo
的参数(即
1
)。因为你以
i
的身份通过了2,你得到了
1+2

例如,如果您使用一个arrow函数试图访问函数调用之外的参数,您应该得到一个
ReferenceError

const f=i=>console.log(参数[0])
试一试{
f()
assert(false,“不应到达此处”)
}捕获(e){
assert(引用错误的实例,
'尝试访问参数时应获取引用错误')
console.log(e.message)
}

为了让您更清楚一点,我将其改写为ES5

function foo(){
   var arg1 = arguments[0]; // argument is 1 in your example
   var f = function(i) {
      return arg1 + i; // i is 2 in your example
   };
   return f(2); // returns 3
}

foo(1); // sets argument to 1 and returns 3

在ES6中,arrow函数不像标准函数那样具有arguments属性。您正在像对象一样访问foo函数参数数组。由于传入的第一个参数是1,arrow函数访问foo function arguments对象并检索arrow函数中的第一个值。

foo
中,
arguments[0]
具有
1
值,因为
foo
的参数是
1
f(2)
正在使用参数2调用函数
f
,参数2调用箭头函数,并将2添加到参数[0],参数[0]为1。因此,输出是3。@hassaniam,其中是函数
f
var f=(i)=>参数[0]+i这是您的函数
f
@hassaniam谢谢您的解释。现在,我明白了。:)很高兴帮助你,伙计!:)在执行
返回f(2)
之前,当函数被调用为
foo(1)
时,
var f
的值是多少??注意:在返回之前(在函数的第二行),在到达
return
函数之前,
i
没有值。var f的值将是一个匿名箭头函数。它在被调用之前不会是一个显式值,就像一个常规函数一样。一旦调用它,它将返回参数[0]+1的值,最初
var f
undefined
,原因是提升,然后为其分配一个箭头函数。因此,在为它指定了一个箭头函数之后,它会保存对该箭头函数的引用。不管你是否调用它,只要试着记录它
function foo(){var f=i=>arguments[0]+i;console.log(f);返回f(2)}foo(1)因此在执行达到返回f(2)
之前,
var f
将是未定义的??因为
i
最初没有分配给它的值。不,它不会被取消定义。在JavaScript解释器点击var f声明之前,它是未定义的。一旦解释器执行var f声明,f的值将是一个箭头函数。当您调用它时,它将返回一个值。e、 g.f(2);