首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无休止的javascript函数原型

无休止的javascript函数原型
EN

Stack Overflow用户
提问于 2013-01-26 02:23:18
回答 2查看 60关注 0票数 0

我正在尝试创建一个无尽的原型函数。这是我的尝试,它不起作用:

代码语言:javascript
运行
复制
function Cat(name, direction) {
this.name = name;
this.stand = {left: "images/standLeft.png", right: "images/standRight.png"};
this.walk = {left: "images/walkLeft.gif", right: "images/walkRight.gif"};
this.direction = direction;
}

Cat.prototype.walking = function() {
var myDirection = (this.direction == "right" ? "+=": "-=");
var myPosition = $("#cat").css("left");
myPosition = myPosition.substring(0, myPosition.length - 2);

var distanceLeft = myPosition;
var distanceRight = 1024 - myPosition - 173;


if(this.direction == "right") {
    var distance = distanceRight;
} else {
    var distance = distanceLeft;
}
    $("#cat img")[0].src =  this.walk[this.direction];
    $("#cat").animate({
        left: myDirection + distance
        }, (22.85 * distance), function(){
            this.direction = (this.direction == "right" ? "left": "right");
             this.walking();
        });
}

var myCat = new Cat("Izzy", "right");

我以为调用(this.walking())会用相同的对象再次运行相同的函数,但是它抛出了一个错误。有什么想法或建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-26 02:27:10

this将会有窗口作用域。

代码语言:javascript
运行
复制
$("#cat img")[0].src =  this.walk[this.direction];
var that = this;
$("#cat").animate({
    left: myDirection + distance
    }, (22.85 * distance), function(){
        that.direction = (that.direction == "right" ? "left": "right");
         that.walking();
    });
票数 1
EN

Stack Overflow用户

发布于 2013-01-26 02:47:58

请参阅我在this StackOvervlow thread上对JavaScript (和jQuery)中的作用域处理的解释。在您的情况下,您应该接受jQuery将选择this作为您的cat对象以外的对象。还要注意,jQuery使用的是HTML元素,而不是cat的实例,所以即使它想要这样做,也不能设置this = your对象。

您可以通过将函数包装在$.proxy (link)中来缓解此问题,如下所示:

代码语言:javascript
运行
复制
// This is your original handler. I made this a named function for clarity.
var animateHandler = function() {
    this.direction = (this.direction == "right" ? "left": "right");
    this.walking();
}

// Now here's your original call to animate.
$("#cat").animate(
    { left: myDirection + distance},
    (22.85 * distance),
    animateHandler
);

// Here's what you'd change it to.
$("#cat").animate(
    { left: myDirection + distance },
    (22.85 * distance),
    $.proxy(animateHandler, this)
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14528034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档