1、js没有块级作用域,定义的i变量属于函数n中的变量,在函数n中可以访问到;
2、函数n中主要涉及两个执行环境: arr[]中保存的函数中的局部环境,函数n的局部环境。相应的作用域链为:arr[]中的函数的变量对象->函数n的变量对象。arr[]中的函数在执行时,作用域链向上查找,自身的变量对象中没有i这个变量,继续向上查找函数n的变量对象,而在经历三次循环后,此时i的值已经是3,所以值为3.
3、如果要让i为相应的数值,应该延长作用域链,使用匿名函数构造块级作用域,方法如下:
function n(){var arr = []
for(var i = 0 i < 3 i++){
// 这里通过匿名函数,传入的参数i是传入的值i的一个副本,会把此时i的值保存下来
arr[i] = (function (i) {
return function(){console.log(i)}
})(i)
}
return arr
}
var funs = n()
funs[0]()
funs[1]()
funs[2]()
o[i].onclick = (function(n1,p1,s1){if (n1.innerHTML == "...展开") {
n1.innerHTML = "收起"
p1.innerHTML = s
} else if(n1.innerHTML == "收起"){
n1.innerHTML = "...展开"
p1.innerHTML = s1.substring(0, 30)
}
})(n,p,s)