[英]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
是从来没有词法解决。 它始终是指以下之一:
valueOfThis.foo()
apply
或call
的第一个参数,例如foo.apply(valueOfThis, params)
或foo.call(valueOfThis, ...)
。 <button onclick="alert(this.tagName.toLowerCase());"/>
Foo = function(){ ... }; new Foo()
例如Foo = function(){ ... }; new Foo()
,正在构造的对象Foo = function(){ ... }; new Foo()
Foo = function(){ ... }; new Foo()
bind
创建的,则绑定到函数的对象,例如bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo()
bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo()
this
是指正在为其访问或设置属性的对象,例如valueOfThis.someProperty = 123
window
(通常),如果没有上述情况,例如foo()
@Bergi在下面的评论中为所有这些内容提供了很好的参考 。
对于绑定函数 ,被调用的函数实际上是与传递给bind
方法不同的函数,因为bind
方法会创建一个新函数
那么周围范围的作用是否被有效地掩盖了,因此词汇作用域实际上在起作用吗?
是的,可以从这种角度看待它。 绑定到helper
作用域的this
遮蔽了绑定到meth
范围的那个。 (如果您使用过箭头功能,则不会)。
但是,您仍然需要记住, this
不是普通变量,而是特殊关键字。 它仅绑定到函数作用域,不可写,在草率模式下具有怪异的强制对象语义,并且始终隐式绑定-如您所说,是一个隐藏参数。
除非您试图了解this
在箭头函数(及其词法解决方案)中的工作方式,否则对范围和阴影的类比是毫无用处的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.