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

ant*_*liu 4 javascript jquery jquery-plugins

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

$.functionone = function(){

    function setOptions(newOptions){
        ...
    }
    this.setOptions = setOptions;
}
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 9

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

this.setOptions = setOptions;
Run Code Online (Sandbox Code Playgroud)

你不打电话setOptions功能,你只是分配给函数的引用到属性,完全像一个属性设置为任何其他对象,就像这样:

var dt;
dt = new Date();
this.today = dt;
Run Code Online (Sandbox Code Playgroud)

使用函数,你可以这样做,这样你以后可以通过属性调用函数(它将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)
Run Code Online (Sandbox Code Playgroud)

您识别的模式,声明一个函数,然后在对象上单独设置对它的引用,经常用于确保生成的函数具有名称.您可以创建一个函数并将其绑定到如下属性:

this.setOptions = function() {
    ...
};
Run Code Online (Sandbox Code Playgroud)

...但是该函数没有名称(属性,但不是函数),这可能是您尝试调试时的问题,因为调试器会显示各种上下文中的函数名称(调用堆栈) , 例如).如果你的很多函数都没有名称,即使引用它们的属性也没有,它会使调试变得困难.更多关于匿名与命名功能的信息.(在实例化函数的时候也存在差异,但是在这里进入它会使事情变得复杂.)

你认为你可以把事情结合起来,像这样:

this.setOptions = function setOptions() {  // <=== DON'T DO THIS
    ...
};
Run Code Online (Sandbox Code Playgroud)

...但是虽然它主要起作用,它会触发Internet Explorer/JScript中的一个错误(它为该代码创建了两个不同的函数,这最多只是内存浪费,最糟糕的是一个非常微妙和浪费时间的问题,因为它是在这个问题).