我是一个javascript新手试图围绕这段代码。 我在这里得到http://brackets.clementng.me/post/24150213014/example-of-a-javascript-closure-settimeout-inside
我仍然很难理解它。因为它涉及一些我不熟悉的模式。
// output 0-9, seperated by 1 sec delay.
for (var i = 0; i < 10; i++) {
setTimeout(function(x) {
return function() {
console.log(x);
};
}(i), 1000*i);
}
这段代码中(i)的含义是什么?
function(x) {
return function() {
console.log(x);
};
}(i)
我认为这是一个立即调用的函数表达式。 但这不是正确的语法:
(function() {
// some code
})();
答案 0 :(得分:2)
实际上,这是一个IIFE。你引用的语法是一个IFE为0的参数;你问的语法是1个参数的IIFE。它会在内部代码中将i
分配给x
。比较:
var print0 = function() {
console.log("Hello!");
};
print0();
(孤立地)等同于
(function() {
console.log("Hello!");
})();
因此名称:你创建一个函数,然后立即调用它。
但是,如果你想要一个参数,没有什么真正改变:
var print1 = function(name) {
console.log("Hello, " + name);
};
print1("George");
(孤立地)等同于
(function(name) {
console.log("Hello, " + name);
})("George");
这里的括号确保函数定义将被视为表达式而不是语句。还有其他方法可以确保这是一个常见的方法
!function() {
console.log("Hello!");
}();
(但是有理由更喜欢括号。)因为你使用它作为setTimeout
调用的参数,所以它可能不是一个声明,所以这些黑客不是必需的。它仍然被调用&#34;立即调用函数表达式&#34;,因为你仍在构造一个函数表达式并立即调用它。
这里使用IIFE的原因是为了捕捉&#34;变量i
的值,而不是x
的位置。如果没有关闭技巧,您将获得10次超时,所有输出10
(当x
结算时,console.log
表示的位置值)。
答案 1 :(得分:0)
是的,D:\MyApp>ionic start diary1 tabs
Creating Ionic app in folder D:\MyApp\diary1 based on tabs project
Downloading: https://github.com/driftyco/ionic-app-base/archive/master.zip
Error Initializing app: Error: connect ECONNREFUSED
at exports._errnoException (util.js:746:11)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19)
Error: connect ECONNREFUSED
at exports._errnoException (util.js:746:11)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19)
connect ECONNREFUSED (CLI v1.6.1)
Your system information:
Cordova CLI: 5.1.1
Ionic CLI Version: 1.6.1
Ionic App Lib Version: 0.3.3
OS: Windows 7 SP1
Node Version: v0.12.7
是呼叫的参数列表。请查看here以获取详细说明。在这种情况下,分组括号是不必要的,因为它是(i)
函数调用的参数,因此无论如何都是表达式。
IIFE一词不仅指这种模式的陈述形式,parenthesis would be necessary。
答案 2 :(得分:0)
在您立即调用的函数示例中,parantheses是可选的。
foreach($xml->Rate as $rate) {
if($rate->@attributes['Symbol'] == 'EURUSD') {
$query = "INSERT INTO tblrate (time, bid) VALUES (NOW(), :bid)";
$query = $pdo->prepare($query);
$query->execute(array(
':bid' => $rate->Bid;
));
}
}
可以重写为
(function() {
// some code
})();
因此,示例函数调用中的function() {
// some code
}();
变为函数定义中的i
。
x