Javascript 在全局上下文中使用类方法时,“this”未定义
我有一个类,它有一个使用Javascript 在全局上下文中使用类方法时,“this”未定义,javascript,class,this,global,Javascript,Class,This,Global,我有一个类,它有一个使用this的方法。我“新建”了这个对象的一个实例,并将其方法传递给全局上下文中的一个变量。如果我调用我的全局函数,这个是未定义的 class Tests { logThis() { console.log(this); } } const globalFunc = new Test().logThis; globalFunc(); // undefined 现在,如果我刚刚使用了一个对象文本,那么这个是全局的 const someObject= {
this
的方法。我“新建”了这个对象的一个实例,并将其方法传递给全局上下文中的一个变量。如果我调用我的全局函数,这个是未定义的
class Tests {
logThis() {
console.log(this);
}
}
const globalFunc = new Test().logThis;
globalFunc(); // undefined
现在,如果我刚刚使用了一个对象文本,那么这个
是全局的
const someObject= {
logThis2: function() {console.log(this)}
}
const globalFunc2 = someObject.logThis2;
globalFunc2(); // global object
在这两种情况下,全局对象都拥有代码,并且应该在globalFunc
执行上下文中提供this
。那么,为什么类生成方法的与此
之间存在差异呢?所有类
es,包括它们的方法,都是在严格模式下评估的。每当创建函数时,“其主体处于严格模式”²,则函数的内部[[mode]]属性将设置为“strict”。当函数在没有上下文的情况下被调用时,这将使this
计算为未定义的
规范中的相关引用:
1:
类声明或类表达式的所有部分都是严格的模式代码
~ES 262,10.2.1严格模式代码
2:
如果此MethodDefinition的函数代码是strict模式代码,则将strict设为true。否则就让严格成为错误
[……]
让闭包成为FunctionCreate(种类、唯一参数、FunctionBody、范围、严格、原型)
执行MakeMethod(闭包、对象)
~ES 262,14.3.7运行时语义:DefineMethodJavaScript类始终处于严格模式。其他函数/上下文不处于严格模式,除非有“使用严格”代码>语句。在严格模式下未指定全局对象时,此
是未定义的
,而不是全局对象。谢谢@Paulpro。那么,指定方法的时间是什么时候呢。原始的此
是否也绑定到该方法。否,有关此
的一般信息,请参阅此问题:。函数没有绑定到它们的this
<代码>此
在调用函数时确定,而不是在定义函数时确定x.foo()
使用this==x
调用函数x.foo
<代码>变量y={bar:x.foo};y、 bar()
使用this===y
调用x.foo
。而var z=x.foo;z()
调用x.foo
,没有this
,这将导致它在严格模式下未定义
,但由于遗留/bc原因,它将在非严格模式下成为全局对象。您存储的是对原型的引用,而不是对实例对象的直接属性的引用。必须使logThis
成为类构造函数中的直接属性,才能执行所需的操作constructor(){this.logThis=this.logThis.bind(this)}
Sorry@Paulpro我仍然不理解它,因为在您的示例中z不在类中(即不在严格模式下)并且在全局上下文中。这就是通话时的情况???