繁体   English   中英

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

[英]jQuery “return { foo: bar, foo2: bar2 }” - What is it?

我正在尝试自学jQuery / Javascript,并且正在浏览Avgrund源代码 ,我不确定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 ] function_name. [ activate / deactivate / disableBlur / show / hide ]

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

method: lemon 如果我叫Avgrund.method()它会调用该函数lemon

总的来说,我正在寻找这种返回语法的解释,我在这里的正确路径吗?

这种结构叫什么,以便我可以在Coffeescript中复制它?

这基本上是在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()

返回值是一个对象

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

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

您走在正确的道路上; 它称为显示模块模式。

在Addy Osmani关于设计模式的书中阅读有关模块模式和显示模块模式的信息。 这是一个很棒的资源。

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

在此示例中,您可以在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

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

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

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

因此,基本上,如果您想使用JavaScript创建对象,可以采用以下多种方法之一:

var obj = {};

因此,您提供的代码意味着您试图返回一个对象,并且“ activate”,“ deactivate” ..是该对象的属性。

请阅读这篇文章,您将有一个更好的主意。

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

第一部分是变量声明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
 }

在源代码中,您具有例如激活的功能,这些功能包含在“ IIFE”的功能范围之内,因此返回的对象正在做的事情是公开这些功能供您使用。 所以show: show例如show: show当时没有调用函数,函数名后的符号是no () ,这里只是说嘿show value记住key:value是一个函数。 因此,在其他地方,您将在代码中调用它并像在HTML中那样调用它Avgrund.show(...)

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对象)中可见。 但是,Avgrund内部的命名函数在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函数,并将它们与打算用作私有函数的函数分开。

正如misterkeg和DotNetHaggis提到的,此模式称为“显示Revealing Module Pattern

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM