繁体   English   中英

遮蔽`this`-词汇名称解析

[英]Shadowing `this` - lexical name resolution

编辑:我认为这不是重复的; 它是一个隐藏参数,我想询问有关this阴影以及词法作用域,请阅读此SO Q / A re。 阴影。

我原以为这个名字的意思this可能是一种动态的(在范围界定方面)得到解决,这样才能解释为什么它不是在我看来,不被词法解决:

function foo() {return this;}
var a = {f: foo};
var b = {f: foo};

a.f() !== b.f();
a.f() !== foo();
a.f() !== window; //not strict mode

但是后来我读到,每个函数都无提示地this作为附加参数接收。 (我意识到箭头功能是不同的。)

显然helper()不能像我们希望的那样工作:

ob = {
  meth: function(){
    var helper = function() {return this;};
    return helper();
  }
};
ob.meth(); //Window or undefined

据我了解,不是通过查看封闭范围来解决this问题(结果是ob ),而是解释器正在调用helper()并将this设置为undefined (严格模式),并作为参数静默传递。

因此,在围绕范围是this有效的被遮蔽 ,因此词法作用域其实是在行动?

你是对的。 除了在箭头的功能的情况下, this是从来没有词法解决。 它始终是指以下之一:

  1. 调用函数的对象,例如valueOfThis.foo()
  2. applycall的第一个参数,例如foo.apply(valueOfThis, params)foo.call(valueOfThis, ...)
  3. 对于事件处理程序,例如<button onclick="alert(this.tagName.toLowerCase());"/>
  4. 当函数用作构造Foo = function(){ ... }; new Foo()例如Foo = function(){ ... }; new Foo() ,正在构造的对象Foo = function(){ ... }; new Foo() Foo = function(){ ... }; new Foo()
  5. 如果函数是使用bind创建的,则绑定到函数的对象,例如bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo() bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo()
  6. 在getter / setter中, this是指正在为其访问或设置属性的对象,例如valueOfThis.someProperty = 123
  7. window (通常),如果没有上述情况,例如foo()

@Bergi在下面的评论中为所有这些内容提供了很好的参考

对于绑定函数 ,被调用的函数实际上是与传递给bind方法不同的函数,因为bind方法会创建一个新函数

那么周围范围的作用是否被有效地掩盖了,因此词汇作用域实际上在起作用吗?

是的,可以从这种角度看待它。 绑定到helper作用域的this遮蔽了绑定到meth范围的那个。 (如果您使用过箭头功能,则不会)。

但是,您仍然需要记住, this不是普通变量,而是特殊关键字。 它仅绑定到函数作用域,不可写,在草率模式下具有怪异的强制对象语义,并且始终隐式绑定-如您所说,是一个隐藏参数。

除非您试图了解this在箭头函数(及其词法解决方案)中的工作方式,否则对范围和阴影的类比是毫无用处的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM