任何人都可以在JS文件中解释以下函数
function Init()
{
(function set()
{
-----code---
print "hello";
}
)();
}
如果我调用函数Init,它是否会自动运行函数集,或者我需要调用set()来运行它?
答案 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();
现在至少有两件事你可能不想要:
可能存在名称冲突。您可能不知道是否已经在外部函数被调用的任何地方定义了“x”,例如你bind
初始化一些在范围或某事上有x的对象。
有人可以“窃取”您的x并再次调用它。不一定是窃取,你只是泄漏它(一个微妙的bug)和一些其他代码调用x,期望找到自己的x,但实际上,它现在是你的x,因为它是可以访问的。你希望它不是。
因此,您可以立即将其锁定在即时执行的匿名函数中。
希望这可以解决一些问题。
答案 1 :(得分:0)
您需要调用Init();
来执行该功能。
(function () {console.log('IIFE') }());
答案 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);
有关此主题的更多信息:
答案 3 :(得分:0)
当你这样做时
(function set() { /*code here*/ })();
,它相当于
var set = function () { /*code here*/ };
set();
因此,当您调用Init()时,将调用set函数。