为什么这个构造函数(使用 "new Function" )会中断?



我是JS的新手,并且正在尝试构建一个模板函数(MOOC中的分配(,该功能基本上返回一个函数,该函数基于输入字符串和定界符返回渲染模板。

无论如何,这是我到目前为止拥有的代码,我不知道为什么它会破裂..我真的尝试了我能想到的一切!

var template = function(stringToParse, options) {
    // find out if custom delimiters are being used
    if (typeof options != 'undefined') {
        var openDelim = options.open;
        var closeDelim = options.close;
    } else {
        var openDelim = '*(';
        var closeDelim = ')*';
    }
    // get the length of the closing delim for parsing later
    var delimCharLen = closeDelim.length;
    // helper function
    function parseOutFiller(_array) {
        // get an array of the indices of each closing delim in the string
        var closingDelims = [];
        for (i=0; i < _array.length; i++) {
            closingDelims.push(_array[i].indexOf(closeDelim));
        }
        // remove the filler text leading up to the closing dim in each substring
        for (i = 0; i < _array.length; i++) {
            if (closingDelims[i] > 0) {
                _array[i] = _array[i].slice(closingDelims[i] + delimCharLen)
            }
        }
        return _array
    }
    // split array, get the closing indices, and parse out the filler text
    var splitArray = stringToParse.split(openDelim);
    var parsedString = parseOutFiller(splitArray);
    return new Function("var locParsedString = [" + parsedString + "];
                         var inputCopy = [];
                         for (i=0; i < arguments.length-1; i++) {
                             inputCopy.push(arguments[i])
                         }
                         var templateString = '';
                         for (i=0; i < inputCopy.length; i++) {
                             templateString += locParsedString[i];
                             templateString += inputCopy[i];
                         }
                         templateString += locParsedString[locParsedString.length-1];
                         nRepeat = arguments[arguments.length-1];
                         for (i=0; i < nRepeat; i++) {
                             console.log(templateString);
                         }"
                       )
}

然后,当我运行它...

var string = "Is <<! thing !>> healthy to <<! action !>>?";
var logResult = template(string, {open: '<<!', close: '!>>'});
logResult('this', 'eat', 3)
/*
Which should print:
"Is this healthy to eat?"
"Is this healthy to eat?"
"Is this healthy to eat?"
*/

预先感谢!

而不是使用新函数((,只需使用return函数(({}即可。这样,就无需在功能内部创建locparsersring。您可以直接使用放射线:

var template = function(stringToParse, options) {
    // find out if custom delimiters are being used
    if (typeof options != 'undefined') {
        var openDelim = options.open;
        var closeDelim = options.close;
    } else {
        var openDelim = '*(';
        var closeDelim = ')*';
    }
    // get the length of the closing delim for parsing later
    var delimCharLen = closeDelim.length;
    // helper function
    function parseOutFiller(_array) {
        // get an array of the indices of each closing delim in the string
        var closingDelims = [];
        for (i=0; i < _array.length; i++) {
            closingDelims.push(_array[i].indexOf(closeDelim));
        }
        // remove the filler text leading up to the closing dim in each substring
        for (i = 0; i < _array.length; i++) {
            if (closingDelims[i] > 0) {
                _array[i] = _array[i].slice(closingDelims[i] + delimCharLen)
            }
        }
        return _array
    }
    // split array, get the closing indices, and parse out the filler text
    var splitArray = stringToParse.split(openDelim);
    var parsedString = parseOutFiller(splitArray);
    return function () {
        var inputCopy = [];
        for (i=0; i < arguments.length-1; i++) {
            inputCopy.push(arguments[i])
        }
        var templateString = '';
        for (i=0; i < inputCopy.length; i++) {
            templateString += parsedString[i];
            templateString += inputCopy[i];
        }
        templateString += parsedString[parsedString.length-1];
        nRepeat = arguments[arguments.length-1];
        for (i=0; i < nRepeat; i++) {
            console.log(templateString);
        }
    };
}

最新更新