2013-12-09 105 views
0

我想教我自己jQuery/Javascript和我正在通过Avgrund source,我不确定确切返回语句的目的avgrund.jsjQuery“return {foo:bar,foo2:bar2}” - 这是什么?

它是否像某种伪类一样运作?在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?

+1

在'object'中表示的值 – Praveen

+0

[* MDN:* Object Literal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Values,_variables,_and_literals#Object_literals) – Emissary

+0

[揭示模块模式](http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript)。 – Andy

回答

1

返回值是一个对象

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

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

如果当前作用域中没有'deactivate'变量,'obj [deactivate]'会引起一个引用错误。可能你想要的是'obj ['deactivate']' –

+1

@GuilhermeSehn感谢您指出错误。我已纠正它。 – Praveen

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()

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 
0

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

所以,如果你想在JavaScript的多种方法之一来创建一个对象主要是:

var obj = {}; 

所以,你只要你试图返回一个对象,并“激活”方法的代码,“停用“..是这个对象的属性。

请仔细阅读本文,您将会获得一个更好的主意。

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

+0

[哈希](http://en.wikipedia.org/wiki/Hash_function)不是关联数组。你正在考虑哈希映射,它是使用哈希的数据结构。 – Tibos

+0

我只是指关键和价值。只是为了确保一个人正确理解。 –

+1

如果您提供误导性信息,我不会看到一个人如何正确理解。散列是应用于某物的散列函数的结果。 JS对象不是散列函数的结果。 JS对象是偶然使用散列(哈希表)来提高效率的映射(=键值对集合=关联数组)。 – Tibos

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 
} 

在源代码中必须对本文“IIFE”的功能性范围内封入例如激活功能,使对方的返回的对象正在做的是暴露的那些功能为您使用。所以show: show例如当时没有调用该函数,那个函数名后面的那个号是(),它只是说嘿这里的显示值记得key:value是一个函数。因此,在你的代码中,你会调用它并像在HTML中一样调用它Avgrund.show(...)

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对象浏览器)。然而,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的实例返回一个对象,包含引用的函数print() Avgrund本身的内部。我们现在可以从Avgrund以外访问它:

avg.print() // disableBlur called 

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

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

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

相关问题