当我在这样的JavaScript中创建一个匿名函数时:
(function(){
/* some code here */
})()
在哪个对象中添加此功能,此功能将在哪里生效?
你也可以在jQuery源代码中看到一个匿名函数:
(function(window, undefined){
/* some code here */
})(window)
这个函数的参数如何区别于匿名的0-arg函数?
答案 0 :(得分:4)
JavaScript中的函数是值。也就是说,函数由对象表示,与任何其他对象一样,它可以是变量的值或参与表达式。
因此
(function() { ... })
是一个值,就像17
或"hello world"
是一个值。
当一个函数(作为一个值)出现在一个表达式中,并且后面跟着(...)
,括号之间有逗号分隔的表达式列表,那就是函数调用。
好的,所以:
(function() { ... })()
创建一个函数(作为一个值)然后调用该函数而不带参数。函数对象,至少作为该代码的直接结果,不存储在任何地方。它在函数调用完成后基本消失,并且该子表达式的整体值将是函数返回的任何值。
将参数传递给这样的函数与将参数传递给任何其他函数没有什么不同。在您引用的具体示例中,目的是防止由错误的“外来”代码引起的某些异常。你的例子真的应该是:
(function(window, undefined) {
// code
})(this);
符号this
是保留字,其值完全由运行时控制。 (好吧,它在本地执行上下文中的值因此受到控制。)当在全局范围内进行求值时,上面的代码确保里面是匿名函数,符号“window”将是对它的引用全球背景。这种结构对于可以在浏览器以外的上下文中使用的代码也很有用,例如Node.js,其中全局上下文不称为“window”。
答案 1 :(得分:1)
根据Wikipedia definition的第一行:
,您提供的两个示例都是匿名函数匿名函数[...]是一个定义的函数(或子程序),可能被调用,而不受标识符的约束
这些论点对匿名没有任何影响。匿名函数可以使用0,1,2,... n个参数,就像非匿名函数(即命名函数)一样。
匿名函数的一个主要优点是它们不必在任何地方生活 - 它们可以被内联定义和使用,就像其他类型的其他值一样。
答案 2 :(得分:0)
添加@ Pointy的答案将参数添加到匿名函数没有任何区别
(function(){
/* some code here */
})()
(function(window,undefined){
/* some code here */
})(window)
这两个函数在被调用后都会丢失,唯一的区别是在第二个函数内部,一些变量或函数存储在窗口上下文中,但是在调用之后匿名函数本身就会丢失。
如果您需要保留对该功能的引用,请尝试
(window.myFunc = function(arg1, arg2, arg3) {
/* your code here*/
})(arg1, arg2, arg3)