我正在尝试自学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中复制它?
答案 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所述。
正如其他人已经说过的那样,返回的类型是一个简单的对象。