是var self = this; 模式不好?

转换:

我发现自己需要:

var self = this;

我的javascript“类”中有很多内容。尽管通常这样做,但感觉还是有些错误。我希望在这个问题中找到解决这个问题的更好方法,或者说服我这是完全可以的。

这是保持正确绑定的标准方法吗?我是否应该在所有地方都标准化使用“自我”,除非我明确需要“这个”。

编辑:我确切地知道为什么我需要这个,我只是想知道它是否被认为是邪恶的,为什么。我知道还有一个“应用”内置的javascript函数可以在调用方法时显式定义范围。是不是更好?

用户166390:

就像其他人所说的那样:“某种程度上,这个“额外变量”是解决这一事实的唯一方法,因为它this是一个特殊的表达式,因此不是变量,它不受执行上下文/闭包的约束。

但是,我认为您要问的(或我真正想回答的)是:

是否应该var self = this在每个方法/构造函数的顶部放置一个?

摘要

当我尝试过一次并且有相同的问题时,我不再使用这种方法。现在,当需要在闭包中访问时,我保留该构造。对我来说,它有点“嘿,这就是我真正想要的!” 我的代码的语义:

this -> thisself -> this (but really that) in a closure

卡问题:

...虽然通常这样做,但感觉还是有些错误。我希望在这个问题中找到解决这个问题的更好方法,或者说服我这是完全可以的。

做适合您的事情。不要害怕尝试一种方法,以后再切换回去(但请尝试在每个项目中保持一致:-)

这是保持正确绑定的标准方法吗?我是否应该在所有地方都标准化使用“自我”,除非我明确需要“这个”。

“自我”是最常用的名称。如上所述,我更喜欢使用相反的方法,this除非需要使用闭包绑定。

..如果认为它有点邪恶,为什么。

邪恶是一个愚蠢的主观术语(尽管有时很有趣)。我从未说过这是邪恶的,这就是为什么我不遵循这种方法。有人告诉我,我不使用分号是“邪恶的”。我告诉他们,他们实际上应该提出好的论据和/或更好地学习JavaScript :-)

我知道还有一个“应用”内置的javascript函数可以在调用方法时显式定义范围。是不是更好?

问题apply/call在于您必须在函数调用时使用它们。如果其他调用了您的方法之一,那将无济于事,因为this可能已经关闭了。对于执行诸如jQuery样式的回调之类的操作最有用,其中this的元素是回调的元素/项目,等等。

作为旁白...

喜欢避免成员上的“需要自我”,因此通常将所有成员函数提升为接收者(this)只是“流经”(通常是“预期”)的属性

我的代码中的“私有”方法以“ _”开头,如果用户调用它们,它们就在它们上面。当使用原型方法创建对象时,这也更好(实际上是必需的)。但是,道格拉斯·克罗克福德Douglas Crockford)不赞成我的这种“私有”方法,在某些情况下,查找链可能会因注入意外的接收者而使您受挫:

在构造函数中使用“自我”绑定还可以锁定方法的查找链的上限(它不再是向上的多态!),该方法可能正确也可能不正确。我认为通常是不正确的。

快乐的编码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

var self =这个?

bind和var self = this之间的区别?

Enum var的模式翻转

“ var self = module.exports”是什么?吝啬的?

想使用guard语句设置一个self var

JavaScript-var self = this; 自我是不确定的

传递self.var(实例属性)作为默认方法参数

如何在es6类中执行`var self = this`?

JavaScript惯用语的基础是什么:var self = this?

Swift:协议`static var foo:Self`和枚举

self .__ dict __。update(** kwargs)的风格是好还是不好?

zsh ${var##$pat} 参数扩展模式 var 包含 globs

从var值中找到特定的模式

Resharper自定义模式var

Python类:将self.var作为方法参数传递不会产生任何赋值?

在 __init__ 中设置 self.var 时出现 Python 错误

为什么python给出了这个程序的self.var的垃圾值?

将结构成员值存储在具有较短名称的本地var中是不好的做法吗?

如何避免在__init__中使用“ self.x = x; self.y = y; self.z = z”模式?

Shell 字符串模式匹配:var="this is a test"; echo ${var#t?st} 不匹配

正在返回比`在self`以外的值`__enter__`反模式?

为什么self = [super init]确保单例模式?

为什么Scala模式匹配不支持`s“ $ var”`?

理解代码模式 var factory = (0, _react.createFactory)(BaseComponent);

在C#7中使用Var模式

C#7中的var模式有什么好处?

@Environment(\.presentationMode) var 模式:Binding<PresentationMode> 弄乱其他视图

交互模式下的var_dump显示意外结果

JavaScript扩充模块模式var名称重复