Javascript 了解",;这";结合

Javascript 了解",;这";结合,javascript,this,Javascript,This,我正在读“雄辩的Javascript”这本书,我正在读“对象的秘密生活”一章。 作者说: 因为每个函数都有自己的绑定,其值取决于 它们的调用方式不同,您不能引用包装的这个 使用函数关键字定义的常规函数中的作用域 我不明白他所说的“包装范围”是什么意思,你能解释一下并提供一个简单的例子吗?下面是一个例子,说明使用“function”关键字将产生一个与包含范围的“this”含义不同的函数。你可以通过使用箭头函数来克服这个问题 另见: const容器={ 姓名:“鲍勃”, sayName:funct

我正在读“雄辩的Javascript”这本书,我正在读“对象的秘密生活”一章。 作者说:

因为每个函数都有自己的绑定,其值取决于 它们的调用方式不同,您不能引用包装的
这个

使用
函数
关键字定义的常规函数中的作用域


我不明白他所说的“包装范围”是什么意思,你能解释一下并提供一个简单的例子吗?

下面是一个例子,说明使用“function”关键字将产生一个与包含范围的“this”含义不同的函数。你可以通过使用箭头函数来克服这个问题

另见:

const容器={
姓名:“鲍勃”,
sayName:function(){
log('say name root:',this.name);
常量nestedWithFunctionKeyword=函数(){
//请注意,这里引入“function”会破坏“this”引用。它不再是指“container”。
log('say name function:',this.name);
};
nestedWithFunctionKeyword();
//但如果我们愿意,我们可以重新绑定“这个”。
nestedWithFunctionKeyword.call(此);
常量nestedWithArrowSyntax=()=>{
log('用箭头说出名称:',this.name);
};
nestedWithArrowSyntax();
},
};
container.sayName();
console.log('--------------');
//现在让我们看看“调用函数的方式”是如何重要的。这里我们不再在“容器”上下文中调用函数,因此结果会发生变化。
const sayNameRef=container.sayName;

sayNameRef();
关键字指它所属的对象,例如:

功能餐车(订单){
这个。顺序=顺序;
this.table='table 1';
this.eatHere=eatHere
this.goOutside=goOutside
函数eatHere(){
//添加()而不是函数
//将使用对象本身的范围
设置超时(()=>{
log(`EAT HERE:eating${this.table}`处的${this.order});
}, 200);
}
函数goOutside(){
//在函数中添加新的函数作用域
//将超出当前对象的范围
setTimeout(函数(){
log(`EAT out:eating${this.table}`处的${this.order});
}, 200);
}
}
let obj=新用餐者(“汤”);
obj.eatHere();//将定义此顺序

obj.goOutside();//此顺序将是未定义的
函数的包装范围将是定义函数的范围。 e、 g

在这里,
internal
函数具有wrapping scope=scope of
outer
。而且,内部函数无法访问outer的
this
,这就是为什么我们需要将其存储在变量
outerThis
中的原因

var innerFunction = outer.call({});
innerFunction();
如果您在chrome控制台上执行上述操作,将打印:

{},        // Caller of outer() (it was bound)
Window     // Caller of inner()

{}
之间的代码是您需要理解的
函数的包装范围。这是否回答了您的问题?
{},        // Caller of outer() (it was bound)
Window     // Caller of inner()