阴影“这个” - 词汇名称解析
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, ...)
。 - DOM 元素,如果是事件处理程序,例如
<button onclick="alert(this.tagName.toLowerCase());"/>
- 当函数用作构造函数时正在构造的对象,例如
Foo = function(){ ... }; new Foo()
- 绑定到函数的对象(如果函数是使用
bind
创建的,例如bar = function(){ ... this ...}; foo = bar.bind(valueOfThis); foo()
- 在 getter/setter 中,
this
是指正在为其访问或设置属性的对象,例如valueOfThis.someProperty = 123
-
window
(通常)如果以上情况都不是,例如foo()
@Bergi下面的评论中为所有这些提供了很好的参考。
对于绑定函数,被调用的函数实际上与传递给 bind
方法的函数不同,因为 bind
方法创建一个新函数
那么,周围的范围是否有效地被遮蔽了,因此词汇范围实际上是在起作用的?
是的,人们可以从这个角度看待它。绑定到helper
作用域的this
将隐藏到meth
作用域的。(如果你使用过箭头函数,它就不会)。
但是,您仍然需要记住,this
不是一个普通变量,而是一个特殊的关键字。它只绑定到函数作用域,它不可写,它在草率模式下具有奇怪的强制对象语义,并且它总是隐式绑定 - 正如你所说,一个隐藏的参数。
除非你试图理解this
在箭头函数中是如何工作的(以及它们的词法分辨率),否则与范围和阴影的类比是毫无用处的。
相关文章:
- 如何调用这个匿名 JavaScript 函数
- 使用“;这个“;JavaScript原型方法中的关键字
- 我需要为我的朋友在这个项目上提供帮助
- 为什么在这个网站上不能通过JS访问元素
- 模块模式和这个
- 你能解释一下这个阶乘函数是如何工作的吗?
- 为什么indexOf在这个js代码中不起作用
- Steam Web API:I'我不知道该如何处理这个看起来像哈希的url来生成图像
- 这个条件语句的逻辑有问题
- 为什么不是'这个jQuery汉堡包按钮不工作
- 如何向这个javascript/jquery函数添加参数
- 为什么获胜'这个半圆长不大
- 这个问号在Flow中意味着什么:“;?()=>“无效”;
- 为什么我在这个javaScript代码中使用NaN
- 你能解释一下为什么这个javascript不正确吗
- KeyPress和Keydown在这个特定的代码上不起作用.只有key-up起作用
- 如何正确地使这个js片段内容不可知
- 如何从函数内部的这个变量中获取值
- JS,“;对象”;,这个和那个.来自蟒蛇这真的让我很困惑.(双关语)
- 阴影“这个” - 词汇名称解析