2010-01-14 80 views
1

在我学习JavaScript的微弱尝试中,我买了一本教你如何用JavaScript做事情的书,但忘了提一提为什么。Javascript函数语法

从PHP来的时候,我熟悉的典型的函数语法:

function name() {return;} 

从我了解的工作原理相同的JS。

然后我决定我要尝试使用YUI 3框架的小项目,继续学习,遇到这... YUI Global Object

YUI().use('node', function(Y) { 
    Y.Node.get('#demo'); 
}); 

据我了解,这是使用“使用'函数的YUI()对象,将'node'传递给'use'函数....但是接下来是什么......为什么它在另一个函数调用中声明一个函数?

有人可以请解释在这里使用的语法?

另外一个很好的参考,它解释了JavaScript一般语法类似于php.net也是有益的。 感谢您的帮助。

+0

这么多好的答案感谢大家清理它。 – user103219 2010-01-14 04:09:32

回答

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'); 
}); 

这两个函数都是等价的。

+0

感谢您的参考,真的帮助明确了。 – user103219 2010-01-14 04:10:04

0

这是一个匿名函数(类似于lambda function)的声明。

YUI().use('node', function(Y) { 
    Y.Node.get('#demo'); 
}) 

在Javascript中,函数是第一类公民 - 它们是任何其他对象;因此,它们可以作为参数传递。

2

在JavaScript中,函数是对象。在这种情况下,它们将传入一个对象作为第二个参数值(并将其定义为内联)。

YUI().use('node', function(Y) { 
    Y.Node.get('#demo'); 
}); 

是与此相同:

var xxx = function(Y) { 
    Y.Node.get('#demo'); 
}; 

YUI().use('node', xxx); 
+0

不,不是所有的Javascript都是一个对象。 – kangax 2010-01-14 05:12:05

+0

@ kangax:你是对的,我修改了我的答案,使其更加准确。请重新考虑你已经失望了。 – 2010-01-14 06:42:05

2

这是构建一个匿名函数,然后传递函数本身作为参数传递给use。然后,use方法将使用一个值调用您的匿名函数,该函数中的值将被称为Y,其中包含您在use的前面参数中要求提供的模块。

这基本上等同于以下内容,这在作为回调传递myFunctionYUI().use,不同的是匿名函数不具有名称:因为JavaScript不

function myFunction(Y) { 
    Y.Node.get('#demo'); 
} 

YUI().use('node', myFunction); 

这种图案用于有任何形式的命名空间或模块的明确概念。但是,可以通过使用函数的作用域作为一种名称空间来模拟它们。在这种情况下,YUI().use将构建一个具有您请求的所有功能的对象,并将该对象传递给您提供的函数,因此您可以使用该对象调用您已导入的方法。

对于JavaScript语法和方法的一个很好的在线参考,我喜欢使用Mozilla Developer Center文档。特别是,他们在JavaScriptDOM上有很好的参考。由于它是Mozilla项目的一部分,它们专注于Gecko(Firefox的渲染引擎)支持的方法和语法,但它们通常包含兼容性说明以提及可移植性和Gecko特有的内容。

对于你的问题,我建议阅读关于functions and function scope的MDC文档。令人遗憾的是,MDC通常不会在谷歌搜索中名列前茅;相反,你会得到W3Schools,这往往是质量较低,并有更多的广告。我发现,为了获得MDC文档,总是在我的搜索前添加JavaScript或带有“mdc”的DOM前缀,所以,例如,找到那个链接,我搜索了mdc function,并找到了我需要的。

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上邮票,这样我就可以” t帮助你,对不起:-)

0

显示的内容是什么被称为匿名函数作为参数传递给函数。我不认为PHP有​​这样的一流功能,所以我不知道如何解释语法(我也没有用PHP做太多,所以..)

这是我的示例代码:

function something_random(a) { 
    alert("the type of a is ... " + typeof(a)); 
    if (typeof(a) === 'function') { 
     a(); 
    } 
} 
有了这个功能

现在,你可以插入到这个萤火虫或类似的东西,并运行下面的代码:

something_random(function() { 
    alert("This is a test."); 
}); 

一些有趣的将发生在这里 - 你会得到两个警报。应该说“a的类型是......功能”,另一个应该说“这是一个测试”。这是因为在JavaScript以及其他一些语言中,函数的处理就像对象一样(从技术上讲它们是对象)。

如果你喜欢,你可以整天抛出函数 - 它们就像数字,数组, 等等。

有趣的事情也可能发生。你也可以将参数传递给匿名函数,这是jQuery所做的很多事情(除非它使用call,但我们不会去那里)。这就是你得到特殊东西的地方,比如你把function(d) {}放在代码中。

希望这会有所帮助。