Javascript绑定行为

Javascript绑定行为,javascript,Javascript,我有两个javascript文件,看起来像: // module1.js var globalFunction = function(val1, val2, callback){ var localVariable1 = val1; var localVariable2 = val2; someAsyncFunction(function(){ callback(localVariable1, localVariable2 ); }); } mo

我有两个javascript文件,看起来像:

// module1.js
var globalFunction = function(val1, val2, callback){
    var localVariable1 = val1;
    var localVariable2 = val2;
    someAsyncFunction(function(){
        callback(localVariable1, localVariable2 );
    });
}

module.exports = function(val1, val2, callback){
    var localVariable1 = val1;
    var localVariabl2 = val2;
    anotherAsyncFunction( function(){
          globalFunction(localVariable1, localVariable2, callback);
    });
}
这是:

function MyClass(val1, val2){
    this._val1 = val1;
    this._val2 = val2;
    this._boundFunc = require("./module1.js").bind(this);
}
MyClass.prototype.doSomething = function(callback){
    this._boundFunc(callback);
}
现在,这个令人难以置信的改进示例将module.exports绑定到类MyClass。引擎盖下面发生了什么?每个MyClass实例是否都有自己的module.exports函数副本,以及在module.exports中引用的globalFunction副本

我担心的是,如果在MyClass的两个不同实例上同步调用多个“doSomething”函数,那么它们可能会在等待异步函数回调时干扰并覆盖彼此的局部变量。如果绑定同时复制了globalFunction和module.exports,那么我认为我没有问题。谢谢

我担心的是,如果调用多个函数,它们可能会干扰并覆盖其他局部变量

不,这永远不会发生。每个函数中的局部变量(
var
s,参数)是为每个函数调用独立创建的。即使调用同一个函数两次,它也会生成两组不相关的局部变量。分配第一次调用中的一个变量不会更改第二次调用中同名的变量

当然,调用会显式共享一个可变值,即类的对象或实例。如果您更改了它的一个属性,并且两个函数调用都在同一个对象上工作,那么它们确实会产生干扰。在您的示例中,
MyClass
实例的带下划线的属性没有在任何地方使用。

每个MyClass实例是否都有自己的module.exports函数副本

不,没有。module1.js中的代码只运行一次,它的module.export是“缓存”的,因此无论何时
需要('./module1')
都会得到该对象的相同实例

它们可以相互干扰并覆盖局部变量


不,他们不能。每次调用函数时都会重新创建这些变量,因此对函数的每次调用都有自己的局部变量,并且不会相互干扰

关于
这一点。\u boundFunc(回调)-导出的函数需要3个参数,而不仅仅是一个。“现在,这个令人难以置信的设计示例绑定了模块。导出”-为什么要这样做?导出的函数是一个普通函数,它甚至不使用
this
关键字。您似乎想绑定“this”上下文,但在所需函数中不以任何方式使用“this”?!