Javascript arrow函数和这个

Javascript arrow函数和这个,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在浏览twitter并发现此推文: 以下是推文中的代码: const double = () => this.x * 2; const numDouble = double.bind({ x: 5 }); numDouble(); 当您在控制台中运行此代码段时,它将生成NaN。 怎么用? Author显式地绑定了x的值,但仍然显示了NaN 作者还指定了arrow函数不能绑定它。正如我所知,arrow函数在词汇上绑定了作用域周围的这个形式的值。那个么作者为什么这么说呢 请澄清我的疑问

我正在浏览twitter并发现此推文:

以下是推文中的代码:

const double = () => this.x * 2;
const numDouble = double.bind({ x: 5 });
numDouble();
当您在控制台中运行此代码段时,它将生成NaN。 怎么用? Author显式地绑定了x的值,但仍然显示了NaN

作者还指定了arrow函数不能绑定它。正如我所知,arrow函数在词汇上绑定了作用域周围的这个形式的值。那个么作者为什么这么说呢

请澄清我的疑问,并提前感谢您的帮助

不要绑定
。根据MDN:

这本书没有约束力 在arrow函数起作用之前,每个新函数都定义了自己的
值
(如果是构造函数,则为新对象,在严格模式下未定义)
函数调用,如果函数作为
“对象方法”等)。这被证明是令人讨厌的
面向对象的编程风格

因此,在您的示例中,
这个
将是全局对象
窗口
,它显然没有名为
x
的属性

示例:

函数foo(){
让箭头=()=>{
console.log(this);//将使用foo的this,因为arrow永远不会有自己的this
}
call({“x”:“x”});/…即使我们使用bind、call或apply指定它
}

foo.call({“y”:“y”});//为foo指定this(此值最终将由arrow使用,因为它将在其范围内可用)
要记住的关键是:

  • 箭头函数关闭
    ,与函数关闭变量的方式完全相同。
    (事实上,这是相同的机制。)
    创建箭头函数的位置就是调用该箭头函数时此
的位置。再也不会是别的了。箭头函数忽略调用它们时使用的
如果您记住了这一点,您就再也不会被箭头函数中的
这个
所迷惑了

当您在控制台中运行此代码段时,它将生成NaN。怎么用?Author显式地绑定了x的值,但仍然显示了NaN

numDouble=double.bind({x:5})
创建一个新函数(
numDouble
),调用该函数时,将调用原始函数(
double
),并将
设置为作为
bind
的第一个参数(
{x:5}
)提供的值。但是由于箭头函数忽略了调用它们的
this
bind
无法控制它们使用的
this

作者还指定了arrow函数不能绑定它。正如我所知,arrow函数在词汇上绑定了作用域周围的这个形式的值

对,这意味着你不能改变它。词汇绑定是闭包的工作方式。此箭头功能:

const a = () => {
    console.log(typeof this);
};
处理
与此传统函数处理
此where函数的方式完全相同

const thisWhereFunctionWasCreated = this;
const t = function() {
    console.log(typeof thisWhereFunctionWasCreated);
};
正如调用时不能更改
thiswerefunction创建的
variable
t
使用的内容一样,调用时也不能更改
a
使用的内容。(如果创建的
thiswerefunction
不是
const
,您可以更改它持有的值,但不能更改创建的
thiswerefunction
变量
t
使用的值。但在该示例中它是一个常量,因为
是一个常量。)

由于arrow函数完全忽略调用它时使用的
this
,因此无论您使用什么机制来告诉arrow函数this
要使用什么,它都不会工作。无论是通过将函数作为方法调用(
obj.arrow()
),还是通过
call
apply
arrow.call(obj)
),还是通过
bind
const-boundArrow=arrow.bind(obj);boundArrow();
)隐式指定
,它仍将使用
关闭:

“严格使用”;
函数{
//`this`将是`new Ctor`创建的对象;抓取它
this.name=“outerThis”;
const outerThis=此;
//'traditional'不能关闭'this',因此您可以更改
//当你用不同的方式称呼它时,它用的是什么
传统函数(testNum){
log(testNum,“传统:”,getName(this));
}
//'arrow'关闭'this',因此您无法更改
//当你叫它“this”时,它用的是什么
常量箭头=testNum=>{
log(testNum,箭头:,getName(this));
};
//记住,直接呼叫中的'this'是全局的
//对象处于松散模式,而在严格模式下为“未定义”;此
//代码处于严格模式
log(“直接调用(默认为`this`):”;
传统的(1);//1传统的:窗口
箭头(1);//1箭头:外侧
log(“`obj.xyz()`:”);
常量对象={
名称:“obj”,
阿罗,
传统的
};
obj.traditional(2);//2 traditional:obj
对象箭头(2);/2箭头:外部
log(“使用`call`:”;
traditional.call(obj,3);//3 traditional:obj
arrow.call(obj,3);/3 arrow:outerThis
log(“使用'bind'和调用结果:”);
const boundTraditional=传统的.bind(obj);
const boundArrow=arrow.bind(obj);
boundTraditional(4);/4 traditional:obj
boundArrow(4);/4 arrow:outerThis
}
函数getName(t){
开关(t){
未定义的情况:
返回“未定义”;
案例窗口:
返回“窗口”;
违约:
返回t.name;
}
}
新的Ctor()
。作为控制台包装器{
最大高度:100%!重要;

}
你能再澄清一点吗?所以根据MDN,箭头函数不绑定这个和al