有什么办法可以避免这种情况的发生?
What are the solutions for avoiding "that"?
使用以下简单的javascript类片段:
var Class = function() {
this.publicvar = 1;
this.privileged = function() {
return this.publicvar;
};
};
var c = new Class();
setTimeout(c.privileged, 1); //c.this -> window
显然这行不通,"this"将是窗口对象。此时我们可以用var =this,然后使用它。publicvar, OR,我们可以这样做。
setTimeout(function() { c.privileged() }, 1); //c.this -> Class
这是一个很好的解决方案,很容易修复,现在我不必在我的课上到处放"that"了。更不用说,当使用object.prototype.publicMethod时,使用"that"会变得复杂得多。
所以,我的问题是:在其他情况下,你需要担心"this"中的"this"。Publicvar"被绑定到窗口上下文,每个问题的解决方案是什么?(我希望我们对每一个问题都有一个解决方案,这样我就不必使用它了!:)
使用Function
的bind
:
setTimeout(c.privileged.bind(c), 1);
或者你可以在构造函数中预设bind
,但这在JS中可能是相当意外的,而在Python中是默认的:
var Class = function() {
this.publicvar = 1;
this.privileged = (function() {
return this.publicvar;
}).bind(this);
};
var c = new Class();
setTimeout(c.privileged, 1);
相关文章:
- 在什么情况下需要同时使用compile&链接函数的角度
- 在什么情况下,Array.observe的“add”事件会触发
- 在这种情况下,*[Symbol.iterator]的含义是什么
- 用户单击带有哈希值的链接以访问该页面,如果禁用Javascript会发生什么情况
- 在这种情况下,“foo[x]”是什么意思?
- 在什么情况下我们需要在javsacript中实现单例类
- 在什么情况下,应该.deep.equal失败,但使用JSON.stringify进行比较工作正常
- 在 301 重定向期间,Google Analytics cookie _ga会发生什么情况
- Java开发人员在不编写Javascript的情况下生成Javascript的最佳方式是什么
- 当浏览器关闭时,运行Web Worker会发生什么情况
- 在这种情况下,有什么方法可以向`.call()`发送更多的参数吗
- 使用node.js模块,在什么情况下模块会被执行两次
- 跨领域意味着什么?JSONP在这种情况下的立场是什么
- JavaScript's数组过滤器函数在没有分配函数的情况下使用-这里发生了什么
- 如何使用AJAX函数在不刷新页面的情况下发送表单,我缺少什么?我必须为此使用休息框架吗?
- 更改 innerHTML 属性时处理程序会发生什么情况
- 以下情况的有效正则表达式是什么
- 在没有服务器根访问权限的情况下构建聊天脚本的有效方法是什么
- 如果在 JavaScript 中的 if 条件之后在执行块中使用两个等于而不是只有一个,会发生什么情况
- 在不影响布局的情况下降低鼠标悬停元素周围的灵敏度的简单方法是什么