Javascript函数定义说明

时间:2017-01-23 20:03:54

标签: javascript function

任何人都可以在JS文件中解释以下函数

function Init()
{
  (function set()
     {
       -----code---
       print "hello";
      }
   )();
}

如果我调用函数Init,它是否会自动运行函数集,或者我需要调用set()来运行它?

4 个答案:

答案 0 :(得分:1)

您需要调用Init来运行其中的任何代码。现在,里面的代码只是常规的JavaScript代码,但却是一个有趣的代码。让我们看看为什么。

如何

你的内心功能是所谓的IIFE。你可以做些什么来让你更容易阅读外部函数(Init),就是用IIFE调用的结果替换内部函数。

以下是一些例子:

var x = undefined; // x === undefined
x = (undefined); // again
x = 3;      // x === 3
x = (3);   // again the same
x = 'some string'; // some string
x = ('some string'); // the same

所以可以将()放在一个对象周围,你得到的是同一个对象。功能相同

x = function() {};   // x is that function now.
x = (function() {}); // the same.

但如果你说x = 3;,你能打电话给x吗?

x = 3;
x(); // syntax error
x = (3);
x(); // again error. can't call a number.

但是,如果你的x是一个函数,你可以调用它:

x = function() { console.log('Hi'); }; // you can call x now.
x(); // logs 'Hi'!

因此,如果你对括号做同样的事情,那就是相同的:

x = (function() { console.log('Hi'); }); // again, the same.
x(); // no error, function called again!

所以你可以跳过作业部分:

// instead of x = (...); and the x(), you replace the x part right away.

(function() { console.log('Hi'); })()
// function body       up to here ^^ now the call part.

请注意,如果没有第一对parens它将无法运行:

function() { console.log('Hi'); }(); // syntax error.

所以你只是将外部的parens ()放在就地将该函数表达式转换为对象。

为什么

这就是它的工作原理。 但为什么?因为你想确保没有其他人称呼你的功能!如果你这样做:

var x = function() {};
x();

现在至少有两件事你可能不想要:

  1. 可能存在名称冲突。您可能不知道是否已经在外部函数被调用的任何地方定义了“x”,例如你bind初始化一些在范围或某事上有x的对象。

  2. 有人可以“窃取”您的x并再次调用它。不一定是窃取,你只是泄漏它(一个微妙的bug)和一些其他代码调用x,期望找到自己的x,但实际上,它现在是你的x,因为它是可以访问的。你希望它不是。

  3. 因此,您可以立即将其锁定在即时执行的匿名函数中。

    希望这可以解决一些问题。

答案 1 :(得分:0)

您需要调用Init();来执行该功能。

(function () {console.log('IIFE') }());

您指的语法是immediately-invoked function expression

答案 2 :(得分:0)

这是js中的基本函数闭包(另一个内部函数)。

也..它是匿名函数。意思是......你只能使用那个函数一次(这就是函数调用附加到函数减速的原因)。所以...

class myClass {

    private $version;

    public function set_version($value){
        $this->version = $value;
    }


}



$class = new myClass();
$class->set_version("1.2");

echo "<pre>";
print_r($class);

有关此主题的更多信息:

MDN - js closures in depth

When to use js closure

答案 3 :(得分:0)

当你这样做时

(function set() { /*code here*/ })();

,它相当于

var set = function () { /*code here*/ };
set();

因此,当您调用Init()时,将调用set函数。