从回调(异步方法)内部访问对象文字属性
Accessing object literal properties from inside callbacks (async methods)
我正在编写一个chrome扩展,它需要与书签子树交互。这个子树有很多交互,所以我将这个逻辑抽象成一个对象文字,如下所示:
var contextStore = {
'root_id': undefined,
'setup': function() {...}, // populates root_id
'add': function(name) {...}, // uses root_id
'remove': function(name) {...}, // uses root_id
// ... etc ...
};
contextStore.setup(); // only once.
contextStore.add("foo");
contextStore.add("bar");
// ... etc
到目前为止,一切都很好。
我遇到的麻烦是由异步Chrome API(以及我缺乏JS-fu(引起的。也就是说:
var contextStore = {
'root_id': undefined,
'setup': function() {
chrome.bookmarks.getTree(function(tree) {
// do some work to find a given folder in bookmarks.
// now I want to save that folder's id for access in other methods.
// Fail: 'this' refers to chrome.bookmarks.getTree.
this.root_id = computed_thing; // doesn't work!
});
}
// ... etc ...
};
我的问题是:
如何从各种Chrome API方法回调内部访问封闭对象文字的成员
我考虑过使用模块模式,但它似乎不会改变事情,而且这段代码不会被扩展之外的任何东西消耗。
您需要存储对指向contextStore
对象的this
的引用;
var contextStore = {
'root_id': undefined,
'setup': function() {
var that = this; // Store reference here.
chrome.bookmarks.getTree(function(tree) {
that.root_id = computed_thing; // does work!
});
}
// ... etc ...
};
这相当于做;
var contextStore = {
'root_id': undefined,
'setup': function() {
chrome.bookmarks.getTree(function(tree) {
contextStore.root_id = computed_thing; // does work!
});
}
// ... etc ...
};
但是,您可以获得不在任何地方重用contextStore
的好处。
this
关键字可以绑定到不同的东西,这取决于你如何调用它。我不是javascript专家,但在a List Apart中有一个很好的解释。
解决方案是在使用my_function.apply(obj, [args])
、my_function.call(obj, args)
(现在调用(调用函数时显式绑定,或者预绑定函数以便稍后调用:my_function.bind(obj)
。
作为一名python程序员,显式可能会让你感到高兴:-(
Matt的答案最终是更好的方法,因为它更加明确、简洁,并且不需要以某种方式调用或准备函数。我只是想试着解释一下发生了什么。
相关文章:
- 如何访问对象内部的“categoryIds”字段/键,该对象包含mongodb's `ObjectId(s)`数
- 使用js或extjs访问对象的java列表
- Javascript-访问对象
- 访问对象的最简单方法'的单独财产
- 分析云代码访问对象
- 如何从字符串变量访问对象属性
- 访问对象中的数组
- 如何访问对象's成员通过另一种方法填充的方法
- 访问对象内的数组
- 是否可以在定义对象时访问对象值
- Javascript 无法访问对象的属性
- $.each 中的“this”,当需要使用“this”访问对象的函数时
- 函数中的 angularJS 访问对象属性不起作用
- 通过存储在变量中的名称访问对象
- 访问对象内部的数组
- 如何从类函数内部访问对象属性
- 访问对象和指定变量
- Javascript - 使用 for 时遇到问题.以循环访问对象
- 为什么可以在内部函数成员中访问对象引用,而不能在内部属性成员中访问
- 当对象的键中有冒号时,如何访问对象属性