Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在全局上下文中使用类方法时,“this”未定义_Javascript_Class_This_Global - Fatal编程技术网

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运行时语义:DefineMethod

    JavaScript类始终处于严格模式。其他函数/上下文不处于严格模式,除非有
    “使用严格”语句。在严格模式下
    未指定全局对象时,此
    未定义的
    ,而不是全局对象。谢谢@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不在类中(即不在严格模式下)并且在全局上下文中。这就是通话时的情况???