会否是参数作用域问题

阿全啊
  • 35

当前我有一个函数:这个函数主要是在使用iview的Table组件进行自定义模版时写的一个用来生成Select的方法,其中h函数vuecreateElement函数,目前遇到的问题是:我在函数进入的地方进行了console可以打印出dataList对象(不为空),但是在数组里面的lambda函数参数dataList却是为空。感觉像是变量作用域的问题,不知如何解决,期待大佬~

//Select EleGene
    function commonGenSelect(h,c,dataList){
        //此处的dataList不为空
        console.log(dataList[0].title)
        return h("Select",{
            props:{
                name:'constraintColType'
            }
        },[
            (h,c,dataList)=>{
                //此处的dataList为空
                console.log("commonGenCheckBox >>"+dataList)
                let OptionArr = new Array();
                dataList.forEach(colKV => {
                    OptionArr.push(h("Option",{
                        props:{
                            label:colKV.title,
                            value:colKV.val
                        }
                    }))
                });    
                return OptionArr;
            }
        ])
    }

(┬_┬),已找到原因,待时间过了,再来补充答案

回复
阅读 1.6k
1 个回答

(┬_┬),在胡乱摸索中把这问题给解决了,其实只是自己对lambda的理解不足及使用错误有关。问题中的函数参数的前两个h、c分别是iview的Table组件自定义模版render时的参数,我自定义了一个函数,包含这两个参数,同时自己传多一个数组。我在内部准备使用这些参数,本来这些参数的作用域已经是整个函数commonGenSelect了,但是我在后续的代码中使用了匿名函数,同时异想天开的将这三个参数作为匿名函数的参数传入,不过此时的匿名参数已经相当于定义了一个新的函数出来,且没有传入实参,导致在内部代码报错undefinded。解决的方法有两种:
一种是直接将匿名函数的参数直接去掉,在匿名函数代码块中使用的变量将是存在于commonGenSelect整个函数作用域内的,此时这些变量就不会为空

()=>{
    let OptionArr = new Array();
    dataList.forEach(colKV => {
        OptionArr.push(h("Option",{
            props:{
                label:colKV.title,
                value:colKV.val
            }
        }))
    });    
    return OptionArr;
}

第二种方法是,匿名函数被定义成三个参数但是没有被传入实参,此时我们可以加多一个调用的步骤,在匿名函数后进行传参及调用

((h,c,dataList)=>{
        let OptionArr = new Array();
        dataList.forEach(colKV => {
            OptionArr.push(h("Option",{
                props:{
                    label:colKV.title,
                    value:colKV.val
                }
            }))
        });    
        return OptionArr;
    })(h,c,dataList)

最后,这个问题也是让我想到
匿名参数在定义的时候,要么挂钩到对应的已有函数中,如

render:(h,c)=>{}
此时其参数是被固定默认传入的

要么在定义出自己的匿名参数后,记得后续进行传参来调用,否则匿名函数的参数将是空的

((a,b)=>{console.log(a+b);})(1,3)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏