获取函数参数的未定义值

时间:2017-08-03 09:14:27

标签: javascript recursion hoisting

我有一个回文函数,只要我不触及函数参数" array",它就可以了。这是功能。

var getInput = function isPalindrome(text) {
    if (text === "undefined") return "this input is not a string, enter a word";
    if (text === "") return "incorrect one, you have to enter a word to test for";
    if (text === null) return false;
    if (text.length <= 1) return true;
    if (text.charAt(0) != text.charAt(text.length - 1)) return false;
    return isPalindrome(text.substr(1,text.length - 2));
}

这个工作正常并且是递归的。

现在在下一行我尝试缓存函数参数:

 var vm = getInput.text;

这导致了问题,我试图将该行本地放入上面的函数中,但它始终返回undefined。我知道如果我在函数之外声明这个变量,只会挂起var,而不是值。

这是函数附加到文档的结果的函数:

window.load = setTimeout(function(){
    document.body.innerHTML += vm + " is a " + isPalindrome('tttyyttt') + " palindrome";
}, 1000);

我已经将setTimeout放在那里,看看是否会在一秒钟后分配vm值,但我得到的结果相同。

只要我不触及顶部函数参数并且不在任何地方引用它,这就顺利运行。

我试图将isPalindrome作为函数声明,尝试使用变量vm,甚至在isPalindrome函数中附加到文档部分,但没有任何作用。

我在这里缺少什么,我想要的只是这部分(fn参数)

document.body.innerHTML += vm + etc

添加到HTML。

这是链接:

https://codepen.io/damianocel/pen/gxwmVE

3 个答案:

答案 0 :(得分:1)

您的脚本中存在大量错误。

请先学习javascript。

以下是适合您的工作代码:

var text = 'tttyyttt';

function isPalindrome(text) {
    if (typeof text !== 'string') {
        return false;
    }

    if (text.length === 0) {
        return true;
    }

    if (text.charAt(0) != text.charAt(text.length - 1)) {
        return false;
    }

    return isPalindrome(text.substr(1,text.length - 2));
}

document.addEventListener('DOMContentLoaded', function() {
    document.body.innerHTML += text + ' is ' + (isPalindrome(text) ? '' : 'not') + ' palindrome';
});

<强> UPD:

var getInput = {
    text: '',

    isPalindrome: function (text) {
        this.text = text;

        if (typeof this.text !== 'string') {
            return false;
        }

        return this.recursiveIsPalindrome(this.text);
    },

    recursiveIsPalindrome: function(text) {

        if (text.length === 0) {
            return true;
        }

        if (text.charAt(0) != text.charAt(text.length - 1)) {
            return false;
        }

        return this.recursiveIsPalindrome(text.substr(1,text.length - 2));
    }
}

function isPalindrome(text) {
    return getInput.isPalindrome(text);
}

document.addEventListener('DOMContentLoaded', function() {
    var result = isPalindrome('tttyyttt');
    document.body.innerHTML += getInput.text + ' is ' + (result  ? '' : 'not') + ' palindrome';
});

答案 1 :(得分:1)

重述你的问题:

  

如何从函数外部访问传递给函数的参数。

答案是:mu

函数,或者说函数内部的代码,或者函数内部的所有变量,只在函数运行时才存在。函数内的任何var foo = ...仅在函数执行时执行某些操作。函数结束后,所有这些变量都超出范围并被丢弃。这也适用于函数参数。

现在,由于您的代码不能同时在函数内部和函数外部,因此您无法通过定义访问函数&#34;来自外部&#34;而函数内部处于运动状态。当前线程在函数内部或函数外部运行代码,它不能同时执行。

所以最好你可以问一下如何在上次调用函数时获取的参数;即你用一些参数调用函数,一旦函数完成并返回给调用者,调用者想要检查它最后调用的参数。答案就是:不。该函数不会在任何地方记住或缓存其最后的参数。你可以编写这样做的代码,但这似乎是多余的,因为调用者已经知道它给函数的参数;它可能只需将它们放在其他地方:

let vm = 'tttyyttt';
document.body.innerHTML += vm + " is a " + isPalindrome(vm) + " palindrome";

答案 2 :(得分:0)

function isPalindrome(text){
    if(typeof text != 'string'){
        return false;
    }

    return {
        text: text,
        isPalindrome: text === text.split('').reverse().join(''),
    };
}