这个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 = thisvar that = this

是的,你会在任何地方看到它。 往往that = this;

看看在事件调用的函数里self是如何使用的? 那些将有自己的上下文,所以self被用来保存thisNote()

尽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“这个”是指别的东西。