为什么这个javascript函数本身就会执行

时间:2014-10-15 12:10:15

标签: javascript node.js google-chrome

我无法理解,是什么让这个功能自行执行。有人可以解释一下吗?感谢

var iCallMySelf = function(){
console.log("Hi there :D");
}
(function(){})

5 个答案:

答案 0 :(得分:4)

这是一个功能

function(){
console.log("Hi there :D");
}

如果您将此函数分配给变量,则可以执行它 - 这是最正常的方法:

foo = function(){
console.log("Hi there :D");
}
foo()

但是,您可以在结尾处使用这些括号直接执行该函数。你必须将它包装在括号中,以使其成为一个声明:

(function(){
console.log("Hi there :D");
})()

Assignment也是一个声明,所以这也可以执行该函数:

var iCallMySelf = function(){
console.log("Hi there :D");
}()

最后,当你执行它时,你可以在最后的那些括号中传入参数:

var iCallMySelf = function(){
console.log("Hi there :D");
}(1, 2, 3)

或者,如在您的示例中,您将另一个函数作为参数传递:

var iCallMySelf = function(){
console.log("Hi there :D");
}
(
    // This is a function being passed as an argument to the function above
    function(){}
)

你可以用你传递的那些arg做的事情:

var iCallMySelf = function(foo){
console.log("Hi there :D");
// foo is the function you pass in below
console.log(foo)
}
(
    // This is a function being passed as an argument to the function above
    function(){}
)

希望有所帮助!

答案 1 :(得分:1)

如果您不想自动拨打电话 你必须把; 像

var iCallMySelf = function(){
console.log("Hi there :D");
};
(function(){})

由于包含下面的功能而自动调用

每当你在一个函数之后调用put(),所以如果你使用分号,那么iCallMyself不会使用next(function(){})

但如果你喜欢这个

var myFun = function()
{
    console.log('Hii');
};
var x = myFun();

它将被调用,你将打印嗨,你的代码也一样。希望你理解

同样也会被称为

var myFun = function()
{
    console.log('Hii');
};
var x = myFun(function(){});

并且在你的问题中你使用了相同的,所以当我在定义x时写函数我可以做到这一点

var x = function(){console.log('Hii')}(function(){});

这就是你提出问题的方式......在你的问题中,iCallMyself不是打印的功能'你好:D'但它作为变量工作,也没有保持函数的返回值,所以为iCallMyself提供值,你的函数应该调用,否则它不会得到任何值,

iCallMyself将保持未定义,即使它不是函数你可以试试这个

var iCallMySelf = function(){
console.log("Hi there :D");
}
(function(){})
console.log(iCallMyself);

只是它的javascript幻觉,我们认为iCallMyself是一个函数,但在这里它不是

如果你打电话给iCallMyself(),

也在你的问题中;你会得到错误,因为它不是一个函数

试试这个

var iCallMySelf = function(){
console.log("Hi there :D");
}
(function(){})

iCallMyself();

它会给出一个错误,即undefined不是一个函数,因为它不是一个函数,它似乎只是但不是真的。

那么分号的逻辑是什么;

当你把分号

var iCallMySelf = function(){
console.log("Hi there :D");
};
(function(){})
iCallMyself();

现在行(function(){})与iCallMyself无关它是一个包装函数而没有别的 现在你可以调用iCallMyself()函数

var x = function(){}();

所以现在当你将它返回给变量

时,function(){}()是可执行的
var x = function(){};

和function(){}不能由var执行,var将保存函数

var x = function(){};() 

和function(){};()now()不是必需的

答案 2 :(得分:0)

您正在传递空白参数。这就像打电话给iCallMySelf(parameter)。想象一下,在声明一个函数并向末尾添加一些东西之后,就好像你要向它发送一组你想要启动它的参数。

如果您稍后再致电iCallMySelf(),它会再次执行此操作。如果你iCallMySelf(blank)它仍然会这样做。在javascript中,函数不需要参数,任何定义的参数仍然是可选的,但如果为空则应该给出一个值。

答案 3 :(得分:0)

将其解析为

var iCallMySelf = function(){console.log("Hi there :D");} ( function(){} );
//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^
//                    a function expression                and another one
//                                                       ^^^            ^^
//                               a call of the first function, passing the second

始终使用分号!

var iDontCallMySelf = function(){
  console.log("Hi there :D");
};
(function(){});

或者至少使用函数声明:

function iDontCallMySelf(){
  console.log("Hi there :D");
}
(function(){});

答案 4 :(得分:0)

如果你想在javascript中创建一个自执行函数,它将如下所示:

(function(param1, param2, ..) {
    // some code ..
})(param1, param2, ..);

您的代码包含自执行功能,因为它后跟()

var iCallMySelf = function() {
    console.log("Hi there :D");
}(function(){})

function(){} (中的)是一个匿名函数,作为参数传递给iCallMySelf函数。

如果您不想调用该功能,请在;之后添加}

var iCallMySelf = function() {
    console.log("Hi there :D");
};

(function(){})