为什么javascript函数是这样的
可能重复:为什么javascript函数是这样的,javascript,Javascript,可能重复: 我是javascript的初学者。我知道如何编写JS用户定义函数。 但最近我遇到了一些我认不出来的东西。有人能给我解释一下这是什么吗 (function( window, undefined ) { var jQuery = (function() { }); window.jQuery = window.$ = jQuery; })(window); 这是什么意思?当我搜索javascript函数时,我只得到 function foo()
我是javascript的初学者。我知道如何编写JS用户定义函数。 但最近我遇到了一些我认不出来的东西。有人能给我解释一下这是什么吗
(function( window, undefined ) {
var jQuery = (function() {
});
window.jQuery = window.$ = jQuery;
})(window);
这是什么意思?当我搜索javascript函数时,我只得到
function foo(){
alert("This is an alert");
}
我知道如何使用这些类型的函数简单回答:这些是立即调用的函数,提供词法范围和闭包 为了更好的解释,请看我前一段时间发布的文章 更新: 词法作用域意味着函数中声明的变量在函数体之外不可见 闭包是一种保持对变量的引用的方法,否则这些变量将超出范围,因为如果它们位于定义函数体的范围内,则该函数的任何后续调用都可以使用闭包。请参阅: 更新2: 如果你真的想了解所有这些,那么我强烈建议你观看1986年由Gerry Sussman和Hal Abelson主持的麻省理工学院讲座
(). 在我看来,要真正理解JavaScript,没有比观看这些讲座更好的方法了,即使它们不是关于JavaScript的。您将很快看到Brendan Eich在设计JavaScript时真正的灵感来自哪种语言。提示:它不是Java。它是一个自行执行的函数,也称为 它通常用于引入
public
和private
名称空间,因为在所述函数内部定义的属性在返回属性时无法从外部访问
例如,如果返回一个对象,则可以将函数视为如下对象:
var a = (function() {
var a= 0; // this is only accessible inside this function
var b = {
a: 1 // this will be returned and therefore be accessible on the outside
};
return b;
})();
console.log(a.a); // outputs 1
foo();
f();
(function (){
alert("This is an alert");
})();
下面是一个函数语句。它可以单独存在
function foo(){
alert("This is an alert");
}
可以这样“调用”(执行):
var a = (function() {
var a= 0; // this is only accessible inside this function
var b = {
a: 1 // this will be returned and therefore be accessible on the outside
};
return b;
})();
console.log(a.a); // outputs 1
foo();
f();
(function (){
alert("This is an alert");
})();
下面是一个函数表达式(例如匿名函数**,请参见底部的编辑**)。 与任何其他表达式一样,它类似于右值,您可以将其分配给变量
var f = function (){
alert("This is an alert");
};
然后,可以像这样“调用”(执行):
var a = (function() {
var a= 0; // this is only accessible inside this function
var b = {
a: 1 // this will be returned and therefore be accessible on the outside
};
return b;
})();
console.log(a.a); // outputs 1
foo();
f();
(function (){
alert("This is an alert");
})();
或者,您可以在其上使用运算符,如下所示:
var a = (function() {
var a= 0; // this is only accessible inside this function
var b = {
a: 1 // this will be returned and therefore be accessible on the outside
};
return b;
})();
console.log(a.a); // outputs 1
foo();
f();
(function (){
alert("This is an alert");
})();
请注意,这个变量现在可以作为参数传递给其他函数!(即,我们可以将函数作为参数传递)
现在,让我们分析一下:
(function( window, undefined ) {
//blah blah blah -1
//blah blah blah -2
})(window);
这可以分为两部分:
var f = function( window, undefined ) {
//blah blah blah
};
f(window);
函数(分配给f)有两个参数,窗口
和未定义
。我们将第一个参数作为窗口
(将由浏览器提供给调用者;它是一个全局对象)传递。请注意,我们没有传递任何第二个参数。但是,由于我们期望函数中有第二个参数,但没有传递任何参数,Javascript解释器将为其分配一个undefined
值(如解释器中定义的)。因此变量(参数)未定义
现在包含未定义
接受这两个值作为参数的主要目的是使函数独立于全局变量。(想象一下,如果某个JS脚本或浏览器插件未定义更改为其他内容,会发生什么!!)
参考:
编辑:
正如@FelixKling所评论的,函数表达式不需要匿名,它们可以有名称
var f = function foo(){
alert("This is an alert");
}
这是一篇关于它们用法的有趣文章。Google自动执行函数。请看我不久前发布的文章。查看这些函数。噢,谢谢,函数一定义就执行。你能解释一下词法范围和闭包的术语吗。JavaScript中的每个函数在技术上形成一个闭包。它不是立即执行的函数的特征。不,它不会自动执行。函数甚至不能命名自己,因为它是匿名的,从不存储在命名变量中。+1用于暗示使用此模式的原因。完整性:函数表达式不必是匿名的,它们可以命名为:
var foo=function bar(){…}代码>。谢谢@FelixKling。我已经补充了这一信息。