首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Backbone.js中嵌套函数调用中*this*的传递

问在Backbone.js中嵌套函数调用中*this*的传递
EN

Stack Overflow用户
提问于 2011-08-06 08:16:20
回答 3查看 1.4K关注 0票数 3

我最近开始在游戏中使用backbone.js。我使用模型来创建计时器,如下所示:

代码语言:javascript
复制
var Timer = Backbone.Model.extend({
    defaults: {
        'hh':00, 'mm':05, 'ss':00
    },

    initialize: function() {
    },

    countDownOnce: function() {
         // Count down the time by 1 sec
    },

    run1: function() {
        this.countDownOnce();
    }

    run2: function() {  
        setInterval(this.countDownOnce, 1000);  
    }  
});

countDownOnce函数(如果像在run1中直接调用的话)可以正常工作。

但是,如果函数作为参数传递给某些内置函数,比如setInterval,就像在run2函数中一样,那么--这个的值就会丢失。

如何将此指针传播到内置函数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-07 20:33:46

骨干文档中有一个关于约束“这个”的有用部分。

基本上,下划线提供了一些非常有用的函数,.bindAll,它帮助您更容易地管理“这是上下文”。

代码语言:javascript
复制
...

initialize: function() {
  _.bindAll(this, 'countDownOnce' //, and whatever other functions you want bound)
}),

...

这将确保无论从哪个上下文调用它,countDownOnce内部的' This‘都引用您的计时器实例。

票数 2
EN

Stack Overflow用户

发布于 2011-08-06 08:24:29

其中一种方法是使用呼叫和应用。例如:

代码语言:javascript
复制
run2: function() {  
    setInterval(this.countDownOnce.call, 1000, this);  
}

还请注意,将带参数的闭包/函数引用传递给setTimeout()和setInterval()需要一些人工黑客才能在IE中正确工作。

票数 1
EN

Stack Overflow用户

发布于 2011-08-06 08:40:28

这个是如何设计javascript的(双关意:)

基本上,“this”绑定到当前上下文,因此,如果在一个函数/方法调用中这样:

代码语言:javascript
复制
var Data = function(name) {
   this.name = name;
}

var myData = new Data("viky");

将引用名称元素"inside“数据(本例中为myData )。

现在,如果您有以下内容:

代码语言:javascript
复制
var Data = function(name) {

function morphName(anotherName) {
  //and if you call this like this ;)
   alert(this.name); //undefined
  }

}

内部函数morphName绑定到“当前”上下文,即外部函数。在javascript中,一切都是一个对象,包括函数。所以外部(匿名)函数没有一个名为name的成员!(说得通吗?)

为了执行,大多数人使用以下方法(按照惯例):

代码语言:javascript
复制
var Data = function(name) {

var that = this; //capture current context. Some prefer self = this;

function morphName(anotherName) {
  //then you access name like that ;)
   alert(that.name);
  }

}

我建议您阅读javascript闭包和作用域以理解这个和那个:D。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6965616

复制
相关文章

相似问题

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