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,因此词汇范围实际上是在行动吗?
答案 0 :(得分:0)
你是对的。除箭头函数外,this
从未在词汇上解决。它总是指以下之一:
valueOfThis.foo()
apply
或call
的第一个参数,例如foo.apply(valueOfThis, params)
或foo.call(valueOfThis, ...)
。<button onclick="alert(this.tagName.toLowerCase());"/>
Foo = function(){ ... }; new Foo()
bind
创建的,例如bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo()
this
指的是正在访问或设置属性的对象,例如valueOfThis.someProperty = 123
window
(通常)如果上述情况均不存在,例如foo()
@Bergi在下面的评论中为所有这些提供了great reference。
对于绑定函数,被调用的函数实际上是与传递给bind
方法不同的函数,因为bind
方法创建了一个新函数
答案 1 :(得分:-1)
周围的范围是否有效地被遮蔽,因此词汇范围实际上是在行动?
是的,人们可以从这个角度来看待它。绑定到this
范围的helper
会影响绑定到meth
范围的范围。 (如果你使用过箭头功能,那就不会了。)
但是,您仍需要记住this
不是普通变量,而是特殊关键字。它只能绑定到函数作用域,它不可写,它在草率模式下具有奇怪的强制到对象语义,并且它总是隐式绑定 - 正如你所说的那样,是一个隐藏参数。
除非你试图理解this
在箭头函数中的作用(以及它们的词汇分辨率),否则与范围和阴影的类比是没有用的。