jQuery“return {foo:bar,foo2:bar2}” - 这是什么?

时间:2013-12-09 12:44:11

标签: javascript jquery

我正在尝试自学jQuery / Javascript并且我正在浏览Avgrund source,我不确定avgrund.js中return语句的完全目的。

它是否像某种伪类一样运作?在Avgrund的index.html函数中,如此定义:var Avgrund = (function(){ ...似乎被称为return语句/函数的成员或任何技术名称。

此:

return {
    activate: activate,
    deactivate: deactivate,
    disableBlur: disableBlur,
    show: show,
    hide: hide
}

这只是限制function_name调用方式的一种方式吗?所以,我只能致电function_name. [ activate / deactivate / disableBlur / show / hide ]

并且冒号之后是要调用的函数名吗?例如,

method: lemon。如果我调用Avgrund.method(),它将调用函数lemon

总的来说,我正在寻找这种返回语法的解释,我是否在正确的道路上?

这种类型的结构叫什么,所以我可以在Coffeescript中复制它?

8 个答案:

答案 0 :(得分:2)

这基本上是在JS中创建对象的简写。这样:

return {
    activate: activate,
    deactivate: deactivate,
    disableBlur: disableBlur,
    show: show,
    hide: hide
}

相当于:

var x = new Object();
x.activate = activate;
x.deactivate = deactivate;
x.disableBlur = disableBlur;
x.show = show;
x.hide = hide;

return x;

此致电:var x = {}var x = new Object()

相同

答案 1 :(得分:1)

返回值是对象

function fun() {
   return {
     activate: activate,
     deactivate: deactivate,
     disableBlur: disableBlur,
     show: show,
     hide: hide
  }
}

var obj = fun();
console.log(obj['deactivate']); //obj.deactivate

答案 2 :(得分:1)

你走在正确的道路上;它被称为揭示模块模式。

Read about module patterns和Addy Osmani关于设计模式的书中的Revealing Module Pattern。这是一个很好的资源。

答案 3 :(得分:0)

如前所述,它返回一个对象。

在此示例中,您可以在Test中封装函数和变量。通过返回对象文字,您基本上可以控制允许最终用户调用的内容。

var Test = (function() {
  var test = function() {
    console.log("hello thar.");
  };
  var test2 = function() {
    console.log("nope");
  };
  return {
    test: test
  };
})();
Test.test();
Test.test2(); // syntax error

答案 4 :(得分:0)

阅读JavaScript模式 - http://www.klauskomenda.com/code/javascript-programming-patterns/

您所指的似乎是揭示模块模式。

答案 5 :(得分:0)

在javascript中,您可以创建匿名对象。在javascript中,对象实际上是关联数组。

所以基本上如果你想用JavaScript创建一个对象,其中一个方法是:

var obj = {};

因此,您提供的代码意味着您尝试返回一个对象并“激活”,“停用”..是此对象的属性。

请阅读这篇文章,你会得到一个更好的主意。

http://3dmdesign.com/development/javascript-variables-and-anonymous-objects

答案 6 :(得分:0)

第一部分是变量声明var Avgrund,它被设置为所谓的“IIFE”立即调用函数,你可能会听到它被称为“自我调用函数”,它是相同的不同短语这是您在函数中显示的“IIFE”(function() {...} )();的语法,稍后会在该对象上返回对象{ }

Javascript中立即调用函数的符号是​​在关键字函数之前打开括号(。在该函数结束时,您会注意到一对括号'()'告诉javascript运行立即调用此函数。

“IIFE”正在返回一个对象。在javascript中,对象由key:value对的集合表示,这些对由逗号,括起,用大括号{ }括起来。所以var emptyObject = {}是一个空对象。

在其他语言中,他们称之为散列,地图,关联数组和字典,但所有这些都基本上是key:value对的集合。

 return {
   activate: activate,
   deactivate: deactivate,
   disableBlur: disableBlur,
   show: show,
   hide: hide
 }

在源代码中,您有一些函数,例如activate,它们包含在“IIFE”的功能范围内,因此返回的对象正在做的是公开这些函数供您使用。所以show: show例如当时没有调用函数,在函数名后面的符号是(),它只是说这里的显示值记住key:value是一个功能。所以,在你的代码中,你将调用它并像在HTML中那样调用它Avgrund.show(...)

答案 7 :(得分:0)

JavaScript中的函数具有范围可见性。这意味着内部函数仅在外部函数中可见。例如:

function outer() {
    function inner() {
    }
    function callInner() {
        inner(); // OK
    }
}
inner(); // ReferenceError: inner() not defined

如果是Avgrund:

function Avgrund () {
    function disableBlur() {
        console.log('disableBlur called');
    }

    function print() {
        // I can see other functions inside Avgrund
        disableBlur();
    }
}

由于在我们的示例中,Avgrund被定义为命名函数,因此它将在全局对象(浏览器中的window对象)中可见。但是,在Avgrrund内部命名的函数在Avgrud对象本身之外是不可见的。为了能够访问这些函数,我们可以返回它们:

function Avgrund () {
    function disableBlur() {
        console.log('disableBlur called');
    }

    function print() {
        // I can see other functions inside Avgrund
        disableBlur();
    }

    return {
        print: printShow
    }
}

Avgrund被定义为构造函数(这是一个用于创建新对象的函数)。所以Avgrund已定义但从未执行过。让我们运行这个函数,看看会发生什么:

var avg = (function Avgrund () {
    function disableBlur() {
        console.log('disableBlur called');
    }

    function print() {
        // I can see other functions inside Avgrund
        disableBlur();
    }

    return {
        print: print
    }
})();

现在我们的Avgrund新实例返回了一个对象,其中包含对Avgrund本身内部函数print()的引用。我们现在可以从Avgrund以外的地方访问它:

avg.print() // disableBlur called

现在回答你的问题。正如您已经正确猜到的那样,此构造(返回对内部函数的引用对象)用于限制对Avgrund中方法的访问。基本上定义Avgrund的公共API函数,并将它们与旨在用作私有函数的函数分开。

这种模式称为Revealing Module Pattern,如misterkeg和DotNetHaggis所述。

正如其他人已经说过的那样,返回的类型是一个简单的对象。