JavaScript:实现回调函数

时间:2013-12-27 00:06:29

标签: javascript

这是一个三部分问题。

在下面显示的代码中,每当我执行函数(walk,run,crawl)时,我都会观察到它以累积方式显示方法distance_travelled的输出:

Trey说谢谢你 特雷走了3 distance的距离 特雷跑了13岁 特雷爬了16岁 特雷跑了26岁

我想确保每个函数通过将distance_travelled方法初始化为 0 来计算距离。

我的第二个问题与回调函数有关。

我正在尝试创建另一个名为doS​​omething()的属性/方法,并让此方法返回一个随机函数(walk,run,crawl)。

例如,如果我执行以下代码:

var returned_function = person.doSomething(); 
returned_function();

它应该执行三种方法之一。我已设法执行方法 run()。但是,当我在浏览器中运行代码时,警告弹出消息显示未定义。此外,我遇到了与第一个问题相同的问题。它以累积方式计算distance_travelled。我该如何解决这个问题?

我的第三个问题。我正在尝试向 person 对象添加一个名为“ fly ”的新方法。 'fly'方法将两个函数作为参数。

我必须有30%的机会让这个人飞。如果此人成功飞行,则应执行函数fly方法(30%的可能性会发生这种情况)。如果此人不能飞行,则应执行第二个功能(70%的可能性会发生这种情况)。

如何在我的代码中实现此功能?有人可以建议如何解决这个问题吗?

<script type="text/javascript">
    var person = new Object();

    person.name = "Trey";
    person.distance_travelled = 0;
    person.say_name = alert(person.name);

    person.say_something = function(xyz) {
        document.write(person.name + " says " + xyz + '<br>');
    }
    person.say_something("thank you");

    person.walk = alert(person.name + " is walking");
    function walk(){
        person.distance_travelled +=3;
        document.write(person.name + " walked a distance of " + person.distance_travelled + '<br>');
    }
    walk();

    person.run = alert(person.name + " is running");
    function run(){
        person.distance_travelled +=10;
        document.write(person.name + " ran a distance of " + person.distance_travelled + '<br>');
    }
    run();

    person.crawl = alert(person.name + " is crawling");
    function crawl(){
        person.distance_travelled +=3;
        document.write(person.name + " crawled a distance of " + person.distance_travelled + '<br>');
    }
    crawl();

    person.doSomething = function(abc){
        alert(run());
    }
    var returned_function = person.doSomething();
    returned_function();


</script>

2 个答案:

答案 0 :(得分:0)

首先:

    person.walk = alert(person.name + " is walking");

可能没有像你想象的那样(因为我不能认为这样的界限可能有意义)。


你的第一个问题很简单。如果您想输出3,只需输出3,而不是distance_travelled

第二个问题:

var activities = ['run', 'walk', 'crawl'];
person.doSomething = function() {
    var randomActivity = activities[Math.floor(Math.random() * activities.length)];
    return function() {
        this[randomActivity]();
    }   
}
var personDoActivity = person.doSomething();
personDoActivity();

person.doSomething = function() {
    var activities = [this.run, this.walk, this.crawl];
    var randomActivity = activities[Math.floor(Math.random() * activities.length)];
    return randomActivity;
}
var doActivity = person.doSomething();
doActivity.call(person);

第三个问题(我正在将它从面向对象改为程序,因为你还没有正确使用OO):

function maybeFly(fly, noFly) {
    if (Math.random() < 0.3) {
        return fly();
    } else {
        return noFly();
    }
}

答案 1 :(得分:0)

因为我仍然无法评论答案-.-

@Amadan

使用.bind()

,doSomething的第二个版本可能更好
person.doSomething = function() {
    var activities = [this.run, this.walk, this.crawl];
    var randomIndex = Math.floor(Math.random() * activities.length);

    return activities[randomIndex].bind(this);
}
var doActivity = person.doSomething();
doActivity();

另外值得注意的是,它更好用,更多的是用javascript的精神来编写

var person = {};

而不是

var person = new Object();