Javascript 为什么这个函数与;这";不工作?关于「;这";及其范围

Javascript 为什么这个函数与;这";不工作?关于「;这";及其范围,javascript,scope,this,Javascript,Scope,This,我知道以这种方式向原型添加方法不是最好的,但我只是在测试 Array.prototype.maap=函数(转换){ 设映射=[]; for(让这个元素){ push(变换(元素)); } 返回映射; } log([0,2,3].maap(n=>n/this.length))你说得对,问题是这个.length。问题是它不在函数中!它位于lambda中,其作用域不是稍后调用它的数组的作用域。因此,this不是数组,this.length是实数0(0/0表示NaN,2/0表示无穷大,3/0也表示无穷

我知道以这种方式向原型添加方法不是最好的,但我只是在测试

Array.prototype.maap=函数(转换){
设映射=[];
for(让这个元素){
push(变换(元素));
}
返回映射;
}

log([0,2,3].maap(n=>n/this.length))你说得对,问题是
这个.length
。问题是它不在函数中!它位于lambda中,其作用域不是稍后调用它的数组的作用域。因此,
this
不是数组,
this.length
是实数0(0/0表示NaN,2/0表示无穷大,3/0也表示无穷大)

您可以硬编码实际值
3
,也可以将逻辑移到函数本身中。或者您可以让lambda(实际上是JavaScript中的“箭头函数”)接受另一个参数:分母的参数

Array.prototype.maap=函数(转换){
设映射=[];
for(让这个元素){
push(transform(元素,this.length));
}
返回映射;
}

console.log([0,2,3].maap((n,m)=>n/m))
箭头函数中的此
在其包含块中引用相同的
。这里,包含的块是顶层,其中
this
指的是
window
,而
window.length
指的是
0

console.log(此===窗口);

console.log(window.length)
我认为问题出在arrow函数上(param
transform
),是的,
这个。length
是直接相关的问题,深入一点,这是一个关于

箭头函数没有自己的
。使用封闭词法范围的

简单地说,其中箭头函数定义了
点的位置

因此,对于您的代码,您传入的参数是
n=>n/this.length
,它是在
window
环境中的
console.log
函数中定义的。因此,真正的问题是:

transf = (n) => {
  console.log(this);    // Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
  return n / this.length
}
console.log([0, 2, 3].maap(transf));

谢谢当我控制台。记录“这个”时,我注意到它是“窗口”,但不知道为什么。我认为需要maap的this,也就是数组,因为根据雄辩的javascript书,“箭头函数是不同的,它们不绑定自己的this,但可以看到它们周围范围的this绑定”。我认为maap函数限定为“它周围的范围”。@SRCP但是箭头函数不在maap函数中。它被传递给maap函数。它只是一个用作函数参数的表达式,在全局范围的代码中。啊,我明白了。这是一个函数,我很困惑。最后,它只返回一个值,即参数。明白了。@SRCP:有点,是的。最好认为这是一个论点。它实际上不返回值,也不是在那里调用的函数。这是一个函数。这更像是您直接编写了
console.log([0,2,3].maap(函数名),它已经存在)
。事实上,这正是它的原貌。