这个JavaScript成语的基础是什么:var self = this?
我在WebKit HTML 5 SQL Storage Notes演示的源代码中看到以下内容:
function Note() { var self = this; var note = document.createElement('div'); note.className = 'note'; note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false); note.addEventListener('click', function() { return self.onNoteClick() }, false); this.note = note; // ... }
作者在某些地方(函数体)使用self,在其他地方使用self (方法的参数列表中定义的函数体)。 这是怎么回事? 现在我已经注意到了,我会开始看到它吗?
请参阅alistapart.com上的这篇文章
即使在上下文发生变化的情况下, self
也被用来保持对原始的引用。 这是一种常用于事件处理程序的技术(尤其是在closures中)。
我认为variables名'self'不应该以这种方式使用,因为现代浏览器提供了一个全局variablesself
指向普通窗口或WebWorker的全局对象。
为了避免混淆和潜在的冲突,你可以写var thiz = this
或var that = this
。
是的,你会在任何地方看到它。 往往that = this;
。
看看在事件调用的函数里self
是如何使用的? 那些将有自己的上下文,所以self
被用来保存this
到Note()
。
尽pipe只能在Note()
函数完成执行后才能执行,但是函数仍然可以使用self
,原因是内部函数由于closures而获取外部函数的上下文。
还应该注意的是,如果你不喜欢var self = this
习惯用法,那么在callback中还有一个替代的代理模式来维护对原始的引用。
由于函数可以通过使用function.apply
或者function.call
来调用给定的上下文,所以你可以编写一个包装函数来返回一个调用你的函数的函数。 查看jQuery的proxy
函数来实现这个模式。 这是一个使用它的例子:
var wrappedFunc = $.proxy(this.myFunc, this);
wrappedFunc
然后可以被调用,并将您的版本作为上下文。
该variables由方法中定义的内联函数捕获。 this
在函数中会引用另一个对象。 这样,您可以使该function在外部范围内保持this
的引用。
这是一个JavaScript的怪癖。 当一个函数是一个对象的一个属性,更适当地称为一个方法, 这是指对象。 在事件处理程序的例子中,包含对象是触发事件的元素。 当一个标准函数被调用时, 这将引用全局对象。 如果您的示例中有嵌套函数,则这根本不涉及外部函数的上下文。 内部函数与包含函数共享作用域,因此开发人员将使用var that = this
变体var that = this
来保留内部函数所需的内容。
其实self是对window( window.self
)的引用,所以当你说var self = 'something'
你覆盖了一个窗口引用给自己 – 因为self存在于window对象中。
这就是为什么大多数开发人员更喜欢var that = this
var self = this;
无论如何; var that = this;
是不符合良好的做法…假定您的代码将被其他开发人员稍后修改/修改您应该使用开发人员社区方面最常见的编程标准
因此,你应该使用类似var oldThis
/ var oThis
/ etc – 在你的作用域中清楚/ / ..不是很多,但将节省几秒钟和几个脑循环
如上所述,“自我”只是用来在进入function之前保留对“这个”的引用。 一旦在function“这个”是指别的东西。