我遇到过这个jquery插件,我完全理解这是如何工作的:
$.functionone = function(){
function setOptions(newOptions){
...
}
this.setOptions = setOptions;
}
我不明白这实际上是做什么的? this.setOptions = setOptions
你可以调用没有括号的函数吗? this.setOptions
和setOptions
之间的关系是什么?
答案 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()
调用它,则会调用引用的函数。