为什么要将“this”分配给jQuery中的变量?
经常在一些jQuery代码我看到this
被分配给jQuery中的变量,我不明白这种方法的原因?为什么要将“this”分配给jQuery中的变量?
这是一个jQuery插件构造函数的例子:
//constructor
function Nullpoll(element, options){
var widget = this;
widget.config = $.extend({}, defaults, options);
widget.element = element;
widget.element.on("click", function() {
alert("Test")
});
widget.element.one("change", function(e){
widget.element.find("button").removeProp("disabled");
});
this.init();
}
this
的值由其调用函数的方式决定。
你把它分配给不同的变量之一:
- 给它更多的信息名或
- (更常见),从而使值在不同的功能可用其可以访问第一功能的范围
在这种特殊情况下,匿名功能pa ssed到widget.element.one()
使用Nullpoll
的呼叫中的值this
。如果试图使用this
关键字,它会得到不同的值(这是什么值将取决于one
功能怎么叫匿名函数)
http://learn.jquery.com/javascript-101/this-keyword/
在JavaScript中,因为在大多数的面向对象的编程语言,this
是在方法中用于指在其上调用的方法的对象的特殊关键字。
- 如果函数是使用
Function.call()
或Function.apply()
,this
将被设置为传递给.call()
/.apply()
第一个参数调用:使用简单一系列步骤来确定这个值。如果传递给.call()
/.apply()
的第一个参数是null
或undefined
,this
将引用全局对象(这是Web浏览器中的window
对象)。 - 如果正在调用的函数是使用
Function.bind()
创建的,则this
将是在创建函数时传递给.bind()
的第一个参数。 - 如果函数被调用为对象的方法,则
this
将引用该对象。 - 否则,该函数将作为一个独立函数被调用,而不会附加到任何对象,并且
this
将引用全局对象。
这个答案描述了'this',但没有回答OP关于为什么'this'被分配给代码中的变量的问题。 – jfriend00 2014-10-28 10:22:38
当使用内联回调的范围内(如在事件处理程序你的例子),回调中this
的值通常与父范围不一样。因此,如果您想在这些回调中访问父范围中的this
的值,那么将其保存到父范围中的局部变量是一种常见的设计模式。然后,在回调中,即使this
在回调中可能具有不同的值,仍然可以从父范围引用该值。
作为第二个好处,一些极小可以通过使用一个局部变量,而不是this
因为局部变量可以被最小化被重新命名为单个字符变量做更小的代码,但this
不能被重新命名。
类似的问题了一堆答案在这里:What is the value of var me = this;
因为,在这种情况下,里面的听众'this'不是'widget'但'widget.element'。在上面声明它更易读 – 2014-10-28 10:08:06