js闭包的问题。

JavaScript015

js闭包的问题。,第1张

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)