会否是参数作用域问题

当前我有一个函数:这个函数主要是在使用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;

            }

        ])

    }


芜湖不芜
浏览 360回答 1
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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript