javascript - 了解 javascript 的范围界定 - 通过一个简单的 Backbone 示例

标签 javascript backbone.js closures this

看看this jsFiddle

下面还列出了代码:

window.MyView = Backbone.View.extend({

ticks: 0,
initialize: function() {
    //window.setInterval(this.onTimerTick, 1000); // arghhh.. can't understand the 'this' scoping       
    window.setInterval(this.onTimerTick2, 1000);  // Works great with globals       
},

render: function() {
    this.$el.text(this.ticks);            
},

onTimerTick: function() {  // Trouble with this
    this.ticks++;
    this.render();
},

onTimerTick2: function() {  // Using globals
    window.ticks2++;
    $('#count').text(window.ticks2);
}
});

window.My = new MyView({ el: $("#count") });
window.ticks2 = 0;

看一下代码,你会发现我想使用onTimerTick函数,但是因为我不知道如何从window-this到My-this,所以我必须使用onTimerTick2中看到的方法。 (通常我会使用 that=this,但在这种情况下这是不够的)

感谢您为让我理解这一点所做的任何尝试(!)

谢谢

拉尔西

最佳答案

经过this.onTimerTick2时要设置超时,将使用 this 调用该函数绑定(bind)到全局对象,而不是您的对象。

如果 underscore.js 可用(根据 @ori 是这样),您可以使用 _.bind()锁定this调用时指向正确的对象:

window.setInterval(_.bind(this.onTimerTick, this), 1000);

以下是一些不依赖于库的解决方案:

// Works in all browsers
var self = this;
window.setInterval(function() {
    self.onTimerTick();
}, 1000);

使用现代 JS 引擎,您还可以使用 Function.bind() 保持正确this :

// Requires a modern JS engine
window.setInterval(this.onTimerTick.bind(this), 1000);

关于javascript - 了解 javascript 的范围界定 - 通过一个简单的 Backbone 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10409274/

相关文章:

backbone.js - Backbone 监听来自 Raphael freeTransform 的事件

javascript - 尝试使用 Node.js Express 连接到 LinkedIn API

javascript - ListViewItem 上的右键单击和上下文菜单事件

javascript - 我该如何修复 'Maximum call stack size exceeded' AngularJS

iOS Swift 如何访问在完成处理程序闭包中创建的数据——在闭包之外

objective-c - 弱(与强)对象引用的生命周期是多少?

lambda - 理解方案代码的结果

javascript - 在 iPhone 上查看完整网站,而非手机版

ruby-on-rails - Backbone.js 前端和 RESTful Rails 后端?

javascript - 获取传入的 backbone.js 模型实例的模型类型