Javascript 错误的绑定技术?

Javascript 错误的绑定技术?,javascript,Javascript,你有没有想过bind到底做什么,以及bind是否会被过度使用 这是被视为不良实践的对象模型(示例a): 这是一个写得更好的对象: var A = function() { this.foo = "foo"; }; A.prototype.bar = function () { console.log("bar"); }; 对于A的每个实例,函数bar不会反复声明。现在查看以下代码段: function origin() { console.log(this.toStr

你有没有想过
bind
到底做什么,以及
bind
是否会被过度使用

这是被视为不良实践的对象模型(示例a):

这是一个写得更好的对象:

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

A.prototype.bar = function () {
    console.log("bar");
};
对于
A
的每个实例,函数
bar
不会反复声明。现在查看以下代码段:

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));
}
函数原点(){
log(this.toString()+“就是我”);
};
var ListofBindef=[];
var dummyObject={};

对于(var i=0;i首先,这是一个函数声明

function foo() {
}
这是一个函数表达式

var foo = function() {};
您的两个
A
s不同。请想象以下代码:

function A(foo) {
  this.bar = function() {
               console.log(foo);
             };
}
这使得
foo
保持私有,并且仍然允许
bar
访问它,这在
A
的原型版本中是不可能的

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

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

function A(foo) {
  function bar() {
    console.log(foo); 
  }
  this.bar = bar;
}
bind
还会创建一个需要更多内存的新函数对象(它必须存储对原始函数的引用,
this
的值等)

使用
bind
会产生影响,但我怀疑这是否会导致你的应用程序出现性能问题。FWIW:在你的第一个例子中调用
bar
来调用
A
比在第二个例子中调用它要快,因为不必再上原型链

请注意,
bind
也可用于咖喱,使其成为一种多功能工具:

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

var logHello = log.bind(null, 'Hello');
logHello(); // prints 'Hello' to the console
结论:使用最适合任务的工具

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

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