这个JS闭包的语句执行顺序是什么?

时间:2017-01-05 06:37:28

标签: javascript closures

我知道关闭的关键是关于范围。但我不知道它的具体执行顺序。

来自“适用于Web开发人员第3版的专业JavaScript”的经典代码,关于闭包。

function createFunctions(){
	var result=new Array();
	alert('haha');
	for(var i=0;i<10;i++){
		result[i]=function(){
			alert(i);
			return i;
		};
	}
	return result;
}
var a=createFunctions();

令我惊讶的是,'哈哈'被警告,而'i'都没有被警告。我只是将功能分配到变量a。为什么语句“警报('哈哈')”在周期未被警告时被警告执行?

当我添加以下代码时,

 var a=createFunctions();
    alert(a[2]);

why it alerted like this

function (){
    			return i;
    		}

不喜欢

function (){
        		return 2;
        		}

此外,当我添加以下代码时,执行语句的顺序将是什么,特别是循环中的语句。

    var a=createFunctions();
       alert(a[2]());

2 个答案:

答案 0 :(得分:1)

致电时

var a=createFunctions() 

alert(&#39; haha​​&#39;)立即执行,并创建一个包含10个函数的数组,并将其分配给变量&#39; a&#39;每个函数警告&#39; i&#39; ;并返回它。

然而,当调用这些函数的任何时(如果你在创建它们之后调用它们),i的值是&#39; 10&#39; (循环终止值)。因此,每次使用

调用其中一个函数时
alert(a[x]()) 

(任何x = 0到9的值) 它将在函数执行时发出警报(10)并在它返回时再次发出警报(10)。

答案 1 :(得分:0)

  

为什么语句“alert('haha')”被警告

因为它是您调用的函数中的警告语句。

  

虽然周期没有执行

循环 已执行。循环只是创建一些函数并将它们分配给数组中的位置。你永远不会调用任何这些功能。

  

当我添加以下代码时,执行语句的顺序是什么

这取决于你添加它的位置。