在javascript函数中,你能设置this.function = function吗?

时间:2010-06-28 06:38:02

标签: javascript jquery jquery-plugins

我遇到过这个jquery插件,我完全理解这是如何工作的:

$.functionone = function(){

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

我不明白这实际上是做什么的? this.setOptions = setOptions你可以调用没有括号的函数吗? this.setOptionssetOptions之间的关系是什么?

2 个答案:

答案 0 :(得分: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 :(得分:1)

只有在添加括号setOptions()时才会调用函数setOptions。如果不添加括号,则可以引用函数。这就像一个普通变量,只有它包含一个函数引用而不是其他一些值。

如果设置this.setOptions = setOptions,则会在此对象上创建一个函数setOptions,该函数指向与setOptions相同的函数。也就是说,如果使用this.setOptions()调用它,则会调用引用的函数。