鍍金池/ 問(wèn)答/網(wǎng)絡(luò)安全  HTML/ 會(huì)否是參數(shù)作用域問(wèn)題

會(huì)否是參數(shù)作用域問(wèn)題

當(dāng)前我有一個(gè)函數(shù):這個(gè)函數(shù)主要是在使用iview的Table組件進(jìn)行自定義模版時(shí)寫(xiě)的一個(gè)用來(lái)生成Select的方法,其中h函數(shù)vuecreateElement函數(shù),目前遇到的問(wèn)題是:我在函數(shù)進(jìn)入的地方進(jìn)行了console可以打印出dataList對(duì)象(不為空),但是在數(shù)組里面的lambda函數(shù)參數(shù)dataList卻是為空。感覺(jué)像是變量作用域的問(wèn)題,不知如何解決,期待大佬~

//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;
            }
        ])
    }

(┬_┬),已找到原因,待時(shí)間過(guò)了,再來(lái)補(bǔ)充答案

回答
編輯回答
綰青絲

(┬_┬),在胡亂摸索中把這問(wèn)題給解決了,其實(shí)只是自己對(duì)lambda的理解不足及使用錯(cuò)誤有關(guān)。問(wèn)題中的函數(shù)參數(shù)的前兩個(gè)h、c分別是iview的Table組件自定義模版render時(shí)的參數(shù),我自定義了一個(gè)函數(shù),包含這兩個(gè)參數(shù),同時(shí)自己傳多一個(gè)數(shù)組。我在內(nèi)部準(zhǔn)備使用這些參數(shù),本來(lái)這些參數(shù)的作用域已經(jīng)是整個(gè)函數(shù)commonGenSelect了,但是我在后續(xù)的代碼中使用了匿名函數(shù),同時(shí)異想天開(kāi)的將這三個(gè)參數(shù)作為匿名函數(shù)的參數(shù)傳入,不過(guò)此時(shí)的匿名參數(shù)已經(jīng)相當(dāng)于定義了一個(gè)新的函數(shù)出來(lái),且沒(méi)有傳入實(shí)參,導(dǎo)致在內(nèi)部代碼報(bào)錯(cuò)undefinded。解決的方法有兩種:
一種是直接將匿名函數(shù)的參數(shù)直接去掉,在匿名函數(shù)代碼塊中使用的變量將是存在于commonGenSelect整個(gè)函數(shù)作用域內(nèi)的,此時(shí)這些變量就不會(huì)為空

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

第二種方法是,匿名函數(shù)被定義成三個(gè)參數(shù)但是沒(méi)有被傳入實(shí)參,此時(shí)我們可以加多一個(gè)調(diào)用的步驟,在匿名函數(shù)后進(jìn)行傳參及調(diào)用

((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)

最后,這個(gè)問(wèn)題也是讓我想到
匿名參數(shù)在定義的時(shí)候,要么掛鉤到對(duì)應(yīng)的已有函數(shù)中,如

render:(h,c)=>{}
此時(shí)其參數(shù)是被固定默認(rèn)傳入的

要么在定義出自己的匿名參數(shù)后,記得后續(xù)進(jìn)行傳參來(lái)調(diào)用,否則匿名函數(shù)的參數(shù)將是空的

((a,b)=>{console.log(a+b);})(1,3)
2017年8月15日 04:06