在我学习JavaScript的微弱尝试中,我买了一本书,教你如何用JavaScript做事,但忘记提及为什么。
来自PHP我熟悉典型的函数语法:
function name() {return;}
根据我的理解,在JS中也是如此。
然后我决定尝试将YUI 3框架用于一个小项目继续学习并遇到这个...... YUI Global Object
YUI().use('node', function(Y) {
Y.Node.get('#demo');
});
据我所知,这是使用YUI()对象的'use'函数,将'node'传递给'use'函数....但是那么......为什么它在声明一个函数另一个函数调用?
有人可以解释一下这里使用的语法吗?
一个很好的参考解释JavaScript一般语法类似于php.net也是有益的。 谢谢你的帮助。
答案 0 :(得分:5)
它是一个匿名函数。它被认为是一个回调。
在PHP 4和早期版本的PHP 5中,您可能会看到如下内容:
<强> PHP 强>
function callback($var){
...
}
array_filter( $array, "callback" );
在PHP 5的更高版本中,您可以将它们定义为内联的匿名函数。
因此,在JavaScript中,旧版本看起来像这样:
<强>的JavaScript 强>
function use_callback(Y){
Y.Node.get('#demo');
}
YUI().use('node', use_callback);
但是通过定义内联匿名函数,您可以保存额外的混乱和定义的函数:
YUI().use('node', function(Y) {
Y.Node.get('#demo');
});
这些功能都是等效的。
答案 1 :(得分:2)
在JavaScript中,函数是对象。在这种情况下,它们传入一个对象作为第二个参数值(并将其定义为内联)。
YUI().use('node', function(Y) {
Y.Node.get('#demo');
});
与此相同:
var xxx = function(Y) {
Y.Node.get('#demo');
};
YUI().use('node', xxx);
答案 2 :(得分:2)
这是构造一个匿名函数,然后将函数本身作为参数传递给use
。然后use
方法将使用一个值调用您的匿名函数,该函数将在函数中调用Y
,其中包含您在use
的先前参数中要求的模块。 / p>
这基本上等同于以下内容,它将myFunction
作为回调传递给YUI().use
,但匿名函数没有名称:
function myFunction(Y) {
Y.Node.get('#demo');
}
YUI().use('node', myFunction);
使用此模式是因为JavaScript没有任何类型的命名空间或模块的显式概念。但是,可以通过使用函数的作用域作为一种命名空间来模拟它们。在这种情况下,YUI().use
将构造一个具有您请求的所有功能的对象,并将该对象传递给您提供的函数,因此您可以使用该Y
对象来调用您的方法已经进口了。
有关JavaScript语法和方法的在线参考,我喜欢使用Mozilla Developer Center文档。特别是,它们在JavaScript和DOM上有很好的参考。由于它是Mozilla项目的一部分,因此它们专注于Gecko(Firefox的渲染引擎)支持的方法和语法,但它们通常包含兼容性说明,以提及可移植的内容以及Gecko的特定内容。
对于您的问题,我建议您阅读functions and function scope上的MDC文档。可悲的是,MDC通常不会在谷歌搜索中占据优势;相反,你会得到W3Schools,这往往质量较低,广告也较多。我发现为了得到MDC文档,总是在搜索任何有关JavaScript或DOM的内容时使用“mdc”前缀是有用的。因此,例如,为了找到该链接,我搜索了mdc function,并找到了我需要的内容。
答案 3 :(得分:2)
在javascript中,函数可以作为变量传递。所以,这里有一些其他方式可以编写YUI代码
//original
YUI().use('node', function(Y) {
Y.Node.get('#demo');
});
//more traditional "global function"
function useNode(Y) {
Y.Node.get('#demo');
}
YUI().use('node', useNode);
//local callback function
var myUseNode = function(Y) {
Y.Node.get('#demo');
}
YUI().use('node', myUseNode);
编辑至于你问题的后半部分,你可以在邮票上写下我对PHP的了解,所以我无法帮助你,对不起: - )
答案 4 :(得分:0)
这是匿名函数(类似于lambda function)声明。
YUI().use('node', function(Y) {
Y.Node.get('#demo');
})
在Javascript中,函数是一等公民 - 它们是任何其他对象;因此,它们可以作为参数传递。
答案 5 :(得分:0)
所显示的内容是所谓的匿名函数,该函数作为参数传递给函数。我不认为PHP有这样的一流函数,所以我不知道如何解释语法(我也没有用PHP做太多,所以..)
这是我的示例代码:
function something_random(a) {
alert("the type of a is ... " + typeof(a));
if (typeof(a) === 'function') {
a();
}
}
现在考虑到这个功能,您可以将其插入Firebug或类似的东西并运行以下代码:
something_random(function () {
alert("This is a test.");
});
这里会发生一些有趣的事情 - 你会得到两个警报。应该说“a的类型是......功能”,另一个应该说“这是一个测试”。这是因为在JavaScript中 - 以及其他一些语言 - 函数被视为对象(好吧,它们在技术上就是对象。)
如果你愿意,你可以整天抛出函数 - 它们就像数字,数组等。
也可能发生一些有趣的事情。你也可以将参数传递给匿名函数,这是jQuery做的很多事情(除了它使用call
,但我们不会去那里。)这是你获得特殊内容的地方,比如你放置{代码中的{1}}。
希望这会有所帮助。