为了账号安全,请及时绑定邮箱和手机立即绑定

会否是参数作用域问题

会否是参数作用域问题

芜湖不芜 2019-02-15 18:12:12
当前我有一个函数:这个函数主要是在使用iview的Table组件进行自定义模版时写的一个用来生成Select的方法,其中h函数是vue的createElement函数,目前遇到的问题是:我在函数进入的地方进行了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 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

(┬_┬),在胡乱摸索中把这问题给解决了,其实只是自己对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)


查看完整回答
反对 回复 2019-02-21
  • 1 回答
  • 0 关注
  • 359 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信