当我们需要使用当前上下文对象调用 javascript 函数时,我看到有两个选项,例如:
- 使用函数绑定(bind)
- 使用 Javascript 闭包
函数绑定(bind)示例
myProject.prototype.makeAjax = function() {
$.get('http://www.example.com/todoItems', function success(items) {
this.addItemsToList(items)
}.bind(this));
}
JS闭包示例
myProject.prototype.makeAjax = function() {
var that = this;
$.get('http://www.example.com/todoItems', function success(items) {
that.addItemsToList(items)
});
}
我想问:
- 两者中哪一个在性能方面更好?
- 编写代码时应该首选哪个?
最佳答案
这可能有点取决于应该首选哪个。我倾向于使用后者(虽然实际上我更喜欢前者,但我们使用的一些第 3 方库限制了它)。我认为选择风格最重要的是保持一致。
关于 prototype.bind 的说明是它不受 IE8 及以下版本的支持,这可能会给您带来问题。
我认为在性能方面,我希望 bind
会稍微慢一点,因为您在其中调用了一个额外的函数,但这可能取决于浏览器优化。不过,当他们的网站恢复正常时,我会尝试组合一个 jsperf
示例来回答这部分问题。
更新
似乎 JSPerf 不会很快出现。这是我放在一起的片段,显示关闭速度更快(假设我做对了)。关闭速度略快 7 倍多。如果您在控制台打开的情况下运行,您将看到计时。
var limit = 100000;
var a = {
val: 0,
do: function(i) { val = i; /* Actually do some work to ensure doesn't get optimised out */ }
};
var b = {
myFunc: function(callback) { callback(); /* Function that's going to change this keyword */}
};
var start = +new Date();
for(var i = 0; i < limit; i++) {
b.myFunc(function() {
this.do(i);
}.bind(a));
};
var end = +new Date();
var diff = end - start;
console.log("bind took " + diff + " ms");
var start = +new Date();
for(var i = 0; i < limit; i++) {
var that = a;
b.myFunc(function() {
that.do(i);
});
};
var end = +new Date();
var diff = end - start;
console.log("closured took " + diff + " ms");
关于javascript - Javascript 中函数绑定(bind)和闭包的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31244229/