gpt4 book ai didi

javascript - 错误的绑定(bind)技术?

转载 作者:行者123 更新时间:2023-11-30 16:49:55 25 4
gpt4 key购买 nike

您有没有想过 bind 到底做了什么,以及 bind 是否可以被过度使用?

这是被视为不良做法的对象模型(示例 A):

var A = function() {
this.foo = "foo";
this.bar = function () {
console.log("bar");
};
};

这是相同对象,写得更好:

var A = function() {
this.foo = "foo";
};

A.prototype.bar = function () {
console.log("bar");
};

函数 bar 没有为 A 的每个实例反复声明。现在看下面的片段:

function origin() {
console.log(this.toString() + " is who I am");
};

var listOfBindedF = [];

var dummyObject = {};

for(var i = 0; i<100;i++) {
listOfBindedF.push(origin.bind(dummyObject));
}

每次绑定(bind)使用时,我都声明了新函数,不是吗?许多库、框架和引擎在其核心中使用绑定(bind)。不仅仅是对于异步调用,没有绑定(bind)真的很难,但实际上在任何地方,自定义继承都是很好的例子。

我自己做了简短的测试来检查它。

  • 长度为 100k 并且充满了对 origin eats 的引用的数组~465kB。
  • 长度为 200k 的数组,对 origin 的 100k 引用和 100k对 dummyObject 的引用占用 ~1.1MB。
  • 长度为 100k 的数组已满origin.bind(dummyObject) 占用 ~9.5MB。

那么我们使用这些框架/库做的 javascript 应用程序是否有任何 bind 性能影响?影响明显吗?是不是很像例子A

最佳答案

首先,这是一个函数声明

function foo() {
}

这是一个函数表达式

var foo = function() {};

你的两个A是不同的。想象一下下面的代码:

function A(foo) {
this.bar = function() {
console.log(foo);
};
}

这使 foo 保持私有(private)并且仍然允许 bar 访问它,这对于 A 的原型(prototype)版本是不可能的。

至于内存问题:显然,每个 function 对象都会占用一些内存。函数表达式总是创建一个新对象。使用您的第一个示例,创建 100 个 A 实例将创建 100 个分配给 bar 的函数对象。

函数声明在进入其周围范围时创建一个实例。因此,在这种情况下,A 的 100 个实例仍将创建 bar 的 100 个实例:

function A(foo) {
function bar() {
console.log(foo);
}
this.bar = bar;
}

bind 还创建了一个需要更多内存的新函数对象(它必须存储对原始函数的引用、this 的值等)

使用 bind 会产生影响,但我怀疑这是否会导致您的应用出现性能问题。 FWIW:在您的第一个示例中为 A 调用 bar 比在您的第二个示例中调用它更快,因为它没有必要向上移动原型(prototype)链。

请注意 bind 也可用于柯里化(Currying),使其成为一个多功能工具:

function log(message) {
console.log(message);
}

var logHello = log.bind(null, 'Hello');
logHello(); // prints 'Hello' to the console

结论:使用最适合某项任务的工具。

关于javascript - 错误的绑定(bind)技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30682153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com