此代码通过将3个字符串数组中的单词随机拟合来生成一个句子。
var arrAimals = ["Dog", "Rat", "Cat"];
var arrNames = ["Amy", "George", "Mary"];
var arrAction = ["Hides", "Finds", "steals"];
var num = 0;
var hero = generateHero();
var stories = [];
var createStory = function(){
var animal = generateAnimal();
stories.push(function(){
var action = generateAction();
console.log(hero + " " + action + " " + animal);
});
}
function generateHero(){
num = Math.floor(Math.random() * 3); // random number between 0 - 2
var hero = arrNames[num];
return hero;
}
function generateAnimal(){
num = Math.floor(Math.random() * 3); // random number between 0 - 2
var animal = arrAimals[num];
return animal;
}
function generateAction(){
num = Math.floor(Math.random() * 3); // random number between 0 - 2
var action = arrAction[num];
return action;
}
createStory();
stories[0]();
stories[0]();
stories[0]();
stories[0]();
stories[0]();

例如,让我们把它作为此时的输出。
George steals Dog
George steals Dog
George Finds Dog
George steals Dog
George Hides Dog
英雄是相同的,因为它是一个全局变量。
每次动作都不同。这也让我明白了。 stories [0]存储对回调函数的引用。因此,每次调用stories[0]()
时,该函数都被称为new,因此每次都会生成不同的操作。
然而,可变动物每次也是相同的(狗)。
我不明白的是动物变量是如何被访问的。 局部变量动物的范围仅在createStory()中。
stories[0]()
绕过createStory()并直接执行回调方法。
那么,每次拨打stories[0]()
时,动物的先前值是如何保留的?