首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript (函数(窗口){})(窗口)

javascript (函数(窗口){})(窗口)
EN

Stack Overflow用户
提问于 2014-03-28 06:35:17
回答 3查看 212关注 0票数 0

https://github.com/mattdiamond/Recorderjs/blob/master/recorder.js中的代码

我不明白javascript的语法

代码语言:javascript
复制
(function(window){
  // blah-blah
})(window)

当我尝试下面的代码时,我可以在控制台中看到"hello world“。

代码语言:javascript
复制
(function(window){
  console.log("hello world");
})(window)

这是什么意思?有推荐信吗?

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-28 06:37:32

这是什么意思?有推荐信吗?

它只是执行括号内的函数,就好像它被拆分为:

代码语言:javascript
复制
f = (function(window){
  console.log("hello world");
})
f(window)
票数 4
EN

Stack Overflow用户

发布于 2014-03-28 06:45:21

在任何JavaScript文件中,如果您编写了如下内容:

代码语言:javascript
复制
justFunction();

//function declaration    
function justFunction() 
{ 
    alert("something");
}

这将调用justFunction()并显示一个警报。定义这样的函数称为函数声明。

现在有另一种方法来定义函数

代码语言:javascript
复制
var anotherFunction = function() { alert ("something")}

如果你写这样的东西

代码语言:javascript
复制
anotherFunction(); 

// Function Expression 
var anotherFunction = function() { alert ("something"); }

虽然anotherFunction是这里的一个函数,但这会给控制台带来一个错误。这就是所谓的函数表达式。

这背后的原因是函数声明在执行任何代码之前加载。而函数表达式仅在解释器到达该代码行时才加载。因此,如果您试图在函数表达式加载之前调用它,您将得到一个错误。

但是,如果您调用函数声明,它将始终工作。因为在加载所有声明之前,不能调用任何代码。因此,在定义函数表达式之后,必须始终调用它。

代码语言:javascript
复制
// Function Expression 
var anotherFunction = function() { alert ("something"); } 
anotherFunction();

现在,可以通过在匿名函数后面添加括号立即调用函数表达式,如

代码语言:javascript
复制
var anotherFunction = function() { alert ("something"); }(); //paranthesis added

这个代码片段和上面的代码片段做同样的事情(显示警报)。现在,anotherFunction变量与上面的不一样,因为它现在被赋值给匿名函数返回的值。现在,它没有返回任何内容,因此anotherFunction是未定义的。所以如果你写这样的东西

代码语言:javascript
复制
var anotherFunction = function() { alert ("something"); }();
anotherFunction(); //error

这将导致错误,因为匿名函数不返回任何函数。如果它返回类似于

代码语言:javascript
复制
var anotherFunction = 
  function() { alert ("something"); return "some string"; }(); //returns string

anotherFunction现在是一个字符串变量。如果:

代码语言:javascript
复制
var anotherFunction = function() { alert ("something"); return function(){
        alert("somethingElse")
        }; }();  // returns function

现在anotherFunction是一个函数,可以像anotherFunction().一样调用

可以将参数传递给此函数表达式,如下所示

代码语言:javascript
复制
var anotherFunction = function(p1,p2) { console.log(p1); 
        console.log(p2); }(param1,param2 ); //param1,param2 are parameters

函数表达式和函数声明的主要区别之一是可以使用一组括号立即调用(调用)函数表达式,但函数声明不能。

现在,如果我们不想将函数表达式赋值给一个变量,那么我们必须将它写在括号内。

代码语言:javascript
复制
(function() { alert ("something");});

要调用它,我们需要在末尾添加另一组括号,如下

代码语言:javascript
复制
(function() { alert ("something"); }());

和前面一样,我们也可以将参数传递给它,例如:

代码语言:javascript
复制
( function(param){ console.log(param); }(param));

这种类型的函数是##标题##called IIFE (立即调用函数表达式)。

IFFE只是一个匿名函数(没有附加名称),它被包装在一组圆括号内,并立即调用(调用)。

代码语言:javascript
复制
( function(){ }());

推介

票数 1
EN

Stack Overflow用户

发布于 2014-03-28 06:49:05

以这个例子为例。

代码语言:javascript
复制
var message = 'hello world';
function Say(msg){
    console.log(msg);
}
new Say(message);

您可以通过不带括号的名称包装Say()并在其后面添加另一个括号并将消息传递给它,从而使其自调用匿名函数。

代码语言:javascript
复制
(function(msg){
    console.log(msg);
})(message);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22705818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档