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);