暗影`this` - 词汇名称解析

时间:2016-03-10 20:53:56

标签: javascript this

编辑:我认为这不是重复的;它是一个隐藏的参数,我想问一下与this相关的阴影,以及词汇范围,阅读this SO Q/A。遮蔽。

我原本以为名称this的含义可能会被动态地解决(就范围界定而言),以便解释为什么我似乎没有在词汇上解决:< / p>

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,而是解释器使用{{1}调用helper()设置为this(严格模式),默默地作为参数传递。

周围范围的undefined实际上是shadowed,因此词汇范围实际上是在行动吗?

2 个答案:

答案 0 :(得分:0)

你是对的。除箭头函数外,this从未在词汇上解决。它总是指以下之一:

  1. 调用函数的对象,例如valueOfThis.foo()
  2. applycall的第一个参数,例如foo.apply(valueOfThis, params)foo.call(valueOfThis, ...)
  3. DOM元素,对于事件处理程序,例如<button onclick="alert(this.tagName.toLowerCase());"/>
  4. 正在构造的对象,当函数用作构造函数时,例如Foo = function(){ ... }; new Foo()
  5. 绑定到函数的对象,如果函数是使用bind创建的,例如bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo()
  6. 在getter / setter中,this指的是正在访问或设置属性的对象,例如valueOfThis.someProperty = 123
  7. window(通常)如果上述情况均不存在,例如foo()
  8. @Bergi在下面的评论中为所有这些提供了great reference

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

答案 1 :(得分:-1)

  

周围的范围是否有效地被遮蔽,因此词汇范围实际上是在行动?

是的,人们可以从这个角度来看待它。绑定到this范围的helper会影响绑定到meth范围的范围。 (如果你使用过箭头功能,那就不会了。)

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

除非你试图理解this在箭头函数中的作用(以及它们的词汇分辨率),否则与范围和阴影的类比是没有用的。