猿问

JavaScript中关于给函数闭包传参的问题!!!!

此函数dim意图是建立一个特定长度的数组(d),从特定的数位(n)开始依次按1增加。

问题1:为什么返回的数组第一位始终是一开始传入的参数?不是应该++吗
问题2:我对闭包的概念不是很懂,麻烦解释一下为什么在6, 7行的函数中加n参数会发生异常(我认为应该把参数导入进下面的参数才对)
比如如果我在第六行的函数中传入n的话他就不会按照我所指定的数位开始增加,而是从0开始
附返回值:(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

函数本体:

Array.dim = function(d, n){    var i,
        a = []        //n = n + 1;
    for (i = 0; i < d; i++){
        a[i] = (function (){  //麻烦解释一下这行的函数中为什么写入n参数会发生异常
            return function(){  //麻烦解释一下这行的函数中为什么写入n参数会发生异常
                return n++
            }()
        })(i)
    }    return a
}var arr = Array.dim(10,2);console.log(arr)  //返回(10) [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]


江户川乱折腾
浏览 689回答 1
1回答

米脂

问题2:在第六行的函数中传入n,相当于给这个函数定义了一个形参n,当 Array.dim(10,2)时,刚开始时i=0,在外面传入参数i,相当于给这个函数的形参n传入值0,所以是从返回(10)&nbsp;[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;d;&nbsp;i++){ &nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;=&nbsp;(function&nbsp;(n){&nbsp;//麻烦解释一下这行的函数中为什么写入n参数会发生异常 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(n)&nbsp;//0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function(){&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n++ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})(i)//相当于刚开始时给这个函数的形参n传入值0}在第七行的函数中传入n,相当于定义了一个形参n,所以值是undefined,undefined++后是NaNfor&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;d;&nbsp;i++){ &nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;=&nbsp;(function&nbsp;(){&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function(n){&nbsp;&nbsp;//麻烦解释一下这行的函数中为什么写入n参数会发生异常 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(n)&nbsp;//undefined &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n++ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})() }这题不用把参数n和i导入也行,函数运行后,发现没有变量n和i就会沿着作用域自动往上找,得到i=0,n=2Array.dim = function(d, n){var&nbsp;i, &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;[]&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;n&nbsp;=&nbsp;n&nbsp;+&nbsp;1;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;d;&nbsp;i++){ &nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;=&nbsp;(function&nbsp;(){&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function(){&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;++n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})() }return&nbsp;a}var arr = Array.dim(10,2);console.log(arr) //返回(10)&nbsp;[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答