这是范围问题还是函数创建问题?

时间:2015-01-24 20:43:58

标签: javascript

我多年没有完成Javascript,而我正试图重新使用它。我只是想创建一些随机数并将它们加在一起。我还想练习使用“getVariable()”来保护对原始变量的操作,同时使整个脚本可以访问它们。我必须记住这个错误,或者我正在做一些非常愚蠢的事情。我不断收到getScore1未定义的消息。我尝试将其编写为函数getScore1()和this.getScore1 = function(){}。有人可以指点我正确的方向吗?

function twoRandomScores(){
    var score1 = Math.random(1, 10);
    var score2 = Math.random(1, 10);
    return score1 + score2;
    this.getScore1 = function(){
            return this.score1;
        }
    function getScore2(){
            return this.score2;
        }
}

document.write(getScore1() + '+' + getScore2() + '=' + twoRandomScores());

3 个答案:

答案 0 :(得分:2)

getScore函数在 内部定义 twoRandomScores()函数,因此无法从外部访问它们。您现在编写的代码并不真正有意义,因为getScore()函数只有在调用 twoRandomScores()之后才会有任何含义对于它的一个特定要求)。这是解决这个问题的唯一方法:

function twoRandomScores(){
    var score1 = Math.random(1, 10);
    var score2 = Math.random(1, 10);
    return {
        score: score1 + score2,
        getScore1: function(){
            return score1;
        },
        getScore2: function(){
            return score2;
        }
    };
}

var scores = twoRandomScores();
console.log(scores.getScore1() + '+' + 
            scores.getScore2() + '=' + 
            scores.score);

然后,为getScore1提供两个函数,getScore2并没有真正完成任何事情,所以你可以这样做:

function twoRandomScores(){
    var score1 = Math.random(1, 10);
    var score2 = Math.random(1, 10);
    return {
        score: score1 + score2,
        score1: score1,
        score2: score2
    };
}

var scores = twoRandomScores();
console.log(scores.score1 + '+' + scores.score2 + '=' + scores.score);

答案 1 :(得分:1)

确定您的代码是正确的?在分配getScore1之前,您将返回该函数,因此不会发生对getScore1和getScore2的分配。因此未定义的错误......

答案 2 :(得分:1)

您将常规函数与用于创建对象的函数类型混合在一起。如果你想创建一个对象(JSFiddle

,这就是它的工作方式
function RandomScore() {
   var score1 = Math.random() * 10,
       score2 = Math.random() * 10;

   // make functions which are properties of the new object
   this.sum = function() {   
       return score1 + score2;
   }
   this.getScore1 = function() {
       return score1;
   }
   this.getScore2 = function() {
       return score2;
   }
}
var randomScore = new RandomScore();
console.log(randomScore.getScore1() + '+' + randomScore.getScore2() + '=' + randomScore.sum());

以下也可以在不制作对象的情况下工作,尽管在实践中它会很不寻常(JSFiddle):

var getScore1, getScore2, sum;   // define variables with global scope
function randomScore() {
    var score1 = Math.random() * 10,
        score2 = Math.random() * 10;
    getScore1 = function() {
        return score1;
    }
    getScore2 = function() {
        return score2;
    }
    return score1 + score2;
}

// we need to run the function once before 
// getScore1 and getScore2 will have any functions assigned to them
sum = randomScore();

// now we can access getScore1 and getScore2 outside of our randomScore function
console.log(getScore1() + '+' + getScore2() + '=' + sum);