- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在错误的上下文中依赖 this
是一个常见的陷阱。一个人为的例子:
function SomeClass() {
this.prop = 42;
document.body.addEventListener('click', function() {
alert(this.prop); // will be undefined
});
}
new SomeClass();
解决此问题的一种方法是使用bind
(或call
或apply
),例如:
function SomeClass() {
this.prop = 42;
document.body.addEventListener('click', (function() {
alert(this.prop); // works
}).bind(this));
}
new SomeClass();
另一种选择是通过闭包引用this
,通常是_this
或self
:
function SomeClass() {
var _this = this;
this.prop = 42;
document.body.addEventListener('click', function() {
alert(_this.prop); // works
});
}
new SomeClass();
我更喜欢后一种方法,因为我可以声明一次,而不是用 bind()
和嵌套回调(我知道这并不理想,但在野外可以看到)包装大量函数) 变得更简单。但我暗暗怀疑 a) 这种方法存在陷阱,或者 b) 我必须首先执行此操作或 bind
的事实意味着我做错了。有什么想法吗?
最佳答案
您解决“此问题”的方法是可行的:
function SomeClass() {
this.prop = 42;
document.body.addEventListener('click', (function() {
alert(this.prop); // works
}).bind(this));
}
new SomeClass();
如果你发现你需要这样做,你真的没有做错任何事,但是根据上下文,如果你担心性能,你可能不想创建新函数(这就是 .bind 内部所做的改变 < em>这个)
您可以使用作用域变量代替绑定(bind),就像您的第二个示例:
function SomeClass() {
var _this = this;
this.prop = 42;
document.body.addEventListener('click', function() {
alert(_this.prop); // works
});
}
new SomeClass();
这里唯一剩下的问题是关于代码的可读性,但我的事情是品味问题,这是我针对这种特殊情况所做的事情
function SomeClass() {
var prop = 42;
document.body.addEventListener('click', function() {
alert(prop); // works
});
}
new SomeClass();
我只是提高了可读性,也许还提高了一点性能,但我并不是说那是做到这一点的“方式”,我想说的是你应该知道如何使用词法范围和闭包并使用(或不使用) ) 在您认为必须的时间/地点(当然,一切都取决于上下文)
编辑:等等!我分配了 this.prop = 42 因为我需要公开该属性在那种情况下,我认为设计 PoV 的最佳实践是通过 getter 公开它:
function SomeClass() {
var prop = 42;
document.body.addEventListener('click', function() {
alert(prop); // works
});
this.getProp = function() {
return prop;
};
this.setProp = function(newValue) { // prop is supposed to be modifiable ?
prop = newValue;
};
}
new SomeClass();
关于与“this”问题无关的设计的另一个旁注,与类中的全局对象交互感觉不对,我会这样做:
function SomeClass(receiver) {
var prop = 42;
receiver.addEventListener('click', function() {
alert(prop); // works
});
}
new SomeClass(document.body);
关于JavaScript:创建对 'this' 的引用(例如 'var _this = this' )与绑定(bind)/调用/应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25897147/
我写了以下代码片段: export class Kurse extends React.Component { constructor(props) { super(props);
这个问题在这里已经有了答案: How to access the correct `this` inside a callback (13 个答案) 关闭 7 年前。 我一直在搜索,但找不到以 ES
我在使用 TypeScript 将 $(this) 替换为 $(_this) 并破坏代码时遇到问题,因为 test 指的是 窗口。 $(".class").click(() => { var
这是一个非常人为的例子,但假设我们在类函数的某处创建了一个变量 _this。 class Person { constructor (public name : string) {} chan
我尝试在 TypeScript 中为 String.Prototype 定义一些属性: Object.defineProperty(String.prototype, 'test', { va
我创建了一个Vue组件,调用imageUpload并将属性作为v模型传递 并且在imgeUpload组件内 我有这个代码 upload:(e)=>{ const files = e.tar
这两种说法有什么区别jquery 中的 $(this) 和 $(_this)。 最佳答案 $(this) 是上下文的当前元素选择器,但 $(_this) 是普通变量选择器。 例如: $('p').on
我正在尝试将最初用 JavaScript 编写的用于捕获视频的实用程序转换为 Angular。 我收到错误_this.video 未定义。原包在这里:https://developer.mozilla
您好,我正在尝试用 JavaScript 创建俄罗斯方 block 。我有一个带有名为 data 的变量的 map 对象。当我从对象调用函数时,“this”不再是对象,而是我认为的本地函数。我尝试在对
我收到以下错误消息:在使用 karma/ Jasmine 的Angular 6单元测试中,this.handler.handle不是函数。当我在项目文件夹中键入“ng test”命令时,在命令行中会出
我正在使用 Gatsby 构建一个网站,现在我正在创建一个 blog-post.js 文件,该文件通过来自 Markdown 文件的 graphql 数据进行查询并为每个文件创建页面。它还应包括页眉、
我有一个可以像这样简化的类: Captcha = function(el) { this.el = $(el); _this = this; captchas.push(thi
我正在尝试整体改进我的代码,尽管以下代码确实有效,但我想避免使用 _this(对我来说这是一种笨拙的方式),并开始使用 .call/.apply 或 .bind 来在以下示例中设置此上下文。 这是 j
我在下面的函数调用中收到一个错误,指出 this.albumDetails 对于特定行是未定义的,即使所有其他 this 调用都工作正常。 错误是:TypeError: _this.albumDeta
我是 React Native 的新手,请帮助我解决这个问题:TypeError: _props.goToScreen 不是一个函数,请帮助我提前致谢 Profile.js 我想单击 GotoHome
我试图通过转换现有应用程序来了解 ES6 和 Angular。毫不奇怪,挑战就是这个! let _$localStorage 来自 ( Injected dependencies not access
在我的 LoginProvider 中,我使用了一个函数来执行登录并将创建的 session 作为 promise 返回。 @Injectable() export class LoginProvid
我对工具提示进行了引导修改。 并使用 webpack/babel 处理我的 js 我的代码的简化可以是: $('[data-toggle="tooltip"]').tooltip({
尝试使用 angular2-flash-messages 并得到控制台错误 _this.flashMessagesService.show is not a function 按照 https://g
在下面的示例中我收到此错误 TypeError: _this is undefined 我尝试了很多方法,但找不到解决该错误的方法,我该如何解决? component_for_home_page.js
我是一名优秀的程序员,十分优秀!