2010-06-28 65 views
4

我遇到了这个jQuery插件,我很明白这是如何工作:在javascript函数中,你能设置this.function = function吗?

$.functionone = function(){ 

    function setOptions(newOptions){ 
     ... 
    } 
    this.setOptions = setOptions; 
} 

什么我不明白是什么东西,这实际上呢? this.setOptions = setOptions你可以调用一个没有括号的函数吗? this.setOptionssetOptions本身之间有什么关系?

回答

9

JavaScript中的函数是(几乎)其他所有对象的对象。当你这样做:

this.setOptions = setOptions; 

你不调用setOptions功能,你只是一个引用赋值给函数的性质,完全像一个属性设置为任何其他对象,就像这样:

var dt; 
dt = new Date(); 
this.today = dt; 

用的功能,你可以这样做,所以你可以再打通过属性的函数(其中规定了this值是属性的物体,这是很方便)。这是一个有点清晰这是怎么回事,如果你使用一个不同的名称属性比对功能:

function functionName() { ... } // Declares the function 
this.propertyName = functionName; // Sets the property 
functionName();     // Calls the function (with `this` = the global object ["window", on browsers]) 
this.propertyName();    // Also calls the function (but with `this` = the object the property's on) 

你确定的模式,声明一个函数,然后分别在对象上的引用设置它,经常用于确保生成的函数具有名称。您可以创建一个功能,并将其绑定到一个像这样的属性:

this.setOptions = function() { 
    ... 
}; 

...但随后的功能没有(财产的做法,但不是功能),它可以是当您尝试调试时出现问题,因为调试器向您显示各种上下文中函数的名称(例如调用堆栈)。如果很多你的函数没有名字,即使引用它们的属性的确如此,它也会使调试变得困难。 More about anonymous vs. named functions here.(还有在当函数实例化方面有差别,但进入在这里只会使事情变得复杂。)

你以为你可以结合起来的东西,像这样:

this.setOptions = function setOptions() { // <=== DON'T DO THIS 
    ... 
}; 

。 ..虽然这主要起作用,但它触发Internet Explorer/JScript中的错误(它为该代码创建了两个不同的功能,这最多是内存浪费,最坏的情况是一个非常微妙和浪费时间的问题,因为它是in this question )。

1

函数setOptions仅在添加圆括号时调用:setOptions()。如果你不添加括号,你可以引用一个函数。这就像一个普通的变量,只是它包含一个函数引用而不是其他值。

如果设置为this.setOptions = setOptions,则对此对象设置功能setOptions,该对象指向与setOptions相同的功能。也就是说,如果您使用this.setOptions()来调用它,则会调用引用的函数。

+0

嘿,在这种情况下,虽然我不太了解代码中的'this',但你已经调用方法$('div')。functionone.setOptions()?它的目的只是在课堂上内部应用吗? – anthonypliu 2010-06-28 20:07:30

+0

没有上下文,目前还不清楚“this”指向什么。它不必指向当前课程。它可能指向div,就像你用$('div')表示的那样。所以这段代码在diff中添加了一个setOptions方法,这样你就可以执行$('div')。setOptions()。你不能做$('div')。functionone.setOptions(),你不能在这样的函数中调用函数。 – Sjoerd 2010-06-29 06:22:47

相关问题