Javascript 为什么我们可以把一个变量放在内部函数的末尾进行闭包? vari; var标记=[]; var infowindow=[]; 对于(i=0;i
这是一个立即函数(也称为自执行函数),请参阅更多。函数末尾的Javascript 为什么我们可以把一个变量放在内部函数的末尾进行闭包? vari; var标记=[]; var infowindow=[]; 对于(i=0;i,javascript,Javascript,这是一个立即函数(也称为自执行函数),请参阅更多。函数末尾的(i)是以i作为输入参数执行函数。这意味着无论i是什么,都将作为参数num传递到函数中 由于函数是anon,它也不能说func(i),因此这本质上是一次定义和执行函数。下面的代码意味着创建一个匿名函数并立即执行它 var i; var marker = []; var infowindow = []; for(i=0; i<results.length ; i++ ){ marker[i] = new google.ma
(i)
是以i
作为输入参数执行函数。这意味着无论i
是什么,都将作为参数num
传递到函数中
由于函数是anon,它也不能说
func(i)
,因此这本质上是一次定义和执行函数。下面的代码意味着创建一个匿名函数并立即执行它
var i;
var marker = [];
var infowindow = [];
for(i=0; i<results.length ; i++ ){
marker[i] = new google.maps.Marker({
position: results[i].geometry.location,
map: map
});
infowindow[i] = new google.maps.InfoWindow({
content: "test" + i
});
google.maps.event.addListener(marker[i], 'click', function(num) {
return function() {
infowindow[num].open(map, marker[num]);
}
}(i));
}
相当于
(function(num){
...
})(i)
这是一种生活
这样做是为了在调用IIFE时在循环中的某个点保留i
的值
var func = function(num){...}
func(i)
…将输出:
1,2,3,4,5
首先,重要的是要知道在javascript中可以定义函数并立即调用它。让我们看看下面的代码:
for (var i = 1; i <= 5; i++) {
setTimeout(function(i) {
return function() {
console.log(i);
};
}(i), 100);
}
如果您运行此代码,您将看到一个带有“1234”的警报对话框。因此,我们定义了一个函数,该函数接收一个数字并显示一个带有该数字的警报对话框。然后,我们调用了该函数,并立即将“1234”作为参数传递
知道GoogleMapsAddListener第三个参数必须是一个函数,我们可以将函数的返回更改为另一个函数
function(num){
alert(num);
}(1234);
当您执行下面的代码时会发生什么情况?它将返回一个函数,调用该函数时会显示一个“1234”警报。您可以将其存储在另一个变量中进行尝试:
function(num){
return function(){
alert(num);
}
}(1234);
现在我们可以将其作为事件回调传递
// "test" variable will have the returned function
var test = function(num){
return function(){
alert(num);
}
}(1234);
test(); // will show the alert with "1234"
当您单击标记时,将显示一条带有“1234”作为消息的警报
现在回到您的代码,我知道返回另一个函数的函数可能有点混乱,但请记住google maps addListener第三个参数必须是一个在单击发生时将被调用的函数。这就是为什么在示例中有一个函数返回另一个函数
还可以看到返回的函数使用在其“父”函数中定义的“num”变量。它在函数的作用域中,因此可以使用它,但是这个“num”解析为什么值?这正是传递“i”值的原因。它将使迭代器索引(i)存储在“num”中变量。因此返回函数将有权访问正确的“i”值
现在,为什么不能在函数中直接使用“i”值?为什么必须将其存储在另一个变量(num)中?因为它一直递增到标记数。因此在循环结束时,它将具有一个等于标记长度的静态值。如果读取它的值,则可能最终使用错误的标记。它会立即执行该函数,并将该变量作为输入参数。
// "test" variable will have the returned function
var test = function(num){
return function(){
alert(num);
}
}(1234);
test(); // will show the alert with "1234"
google.maps.event.addListener(marker[i], 'click', test);