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