函数执行后,在函数外部访问函数内部的局部变量。这是怎么发生的?

时间:2017-06-30 08:15:57

标签: javascript javascript-objects

此代码通过将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]()时,动物的先前值是如何保留的?

0 个答案:

没有答案