gpt4 book ai didi

javascript - `bind` 如何与 `Meteor.bindEnvironment` 一起使用?

转载 作者:行者123 更新时间:2023-11-29 21:41:17 27 4
gpt4 key购买 nike

我对 bindMeteor.bindEnvironment 的行为以及 this 的作用域感到有点困惑 meteor .bindEnvironment。例如,with arrow functions, arrow functions should maintain the outer scope :

Essentially it allows you to create an anonymous function with the contextual value of “this” being the scope of the function being that of the outer function that the arrow function is being defined in.

因此,当我使用以下代码时,它似乎 可以正常工作,但console.log 似乎说this 是作用域 meteor 。

Cylon = new EventEmitter();
Cylon.messages = new Mongo.Collection('_cylon_messages');
Cylon._commands = net.connect(Settings.connection);
Cylon._createConnection = function (name, connection) {
let socket = net.connect(connection, Meteor.bindEnvironment(() => {
this.messages.insert({ name: name, message: 'connected'})
}));
socket._name = name;
return socket;
}

我一直难以理解的另一个示例是在需要 Meteor.bindEnvironment 的回调中使用绑定(bind)。例如:

Cylon.execute = function (routine) {
check(command, String);
let future = new Future();
let done = future.resolver();
this.once('End', Meteor.bindEnvironment(done.bind(null, routine)));
this._commands.write(`XQ#${routine}\r`, 'utf8');
future.wait();
this.removeListener('End', Meteor.bindEnvironment(done.bind(null, routine)));
return future;
}

Meteor.bindEnvironment 如何将 this 绑定(bind)到一个函数?有正确的用法吗?

最佳答案

什么是箭头函数?

这是一个真的令人困惑和冗长的句子:

Essentially it allows you to create an anonymous function with the contextual value of “this” being the scope of the function being that of the outer function that the arrow function is being defined in.

通过将其压缩为更简洁的语言可以使其更易于理解:

It allows you to create an anonymous function that is bound lexically to the scope in which it is defined.

________

Arrow Functions解释

在您提供的示例中没有 console.log - 大概您在给定 bindEnvironment 的箭头函数中放置了一个 console.log >,如下:

let socket = net.connect(connection, Meteor.bindEnvironment(() => {
console.log(this);
// this.messages.insert({ name: name, message: 'connected'});
}));

事实上,上面示例中的 this 将是对箭头函数的执行上下文的引用。例如:

this.stillInScope = true;
let socket = net.connect(connection, Meteor.bindEnvironment(() => {
console.log(this.stillInScope); // => 'true'
}));

但是,假设我们将箭头函数更改为匿名函数。在调用时,它不会保持对在声明时存在的执行上下文的访问:

this.stillInScope = true;
let socket = net.connect(connection, Meteor.bindEnvironment(function () {
console.log(this.stillInScope); // => 'undefined'
}));

因此,如果此示例的当前执行上下文是 Meteor 对象,则箭头函数将词法绑定(bind)到 Meteor 对象:

// this instanceof Meteor === true
let socket = net.connect(connection, Meteor.bindEnvironment(() => {
console.log(this instanceof Meteor); // => 'true'
}));

________

bind方法解释

让我们讨论为什么要使用 bind 来理解第二个示例中实现的目标。

bind 的第一个参数:执行上下文

在方法上使用bind 会生成一个新函数,该函数绑定(bind) 到由第一个参数定义的执行上下文。假设我们在全局执行上下文为 window 的浏览器中运行它:

let method = function () { 
console.log(this);
};

method(); // => window

let boundMethod = method.bind('Hello'); // `this` now becomes 'Hello'
boundMethod(); // => 'Hello'

此绑定(bind)永远无法更改;不是通过在绑定(bind)函数内调用,甚至是通过后续调用 bind

bind 的后续参数:默认参数

在您提供的示例中,bind 实际上只是用作速记。我们可以知道这一点,因为给定的执行上下文是 null,表明 bind 仅用于将 默认参数 应用于功能:

// with `bind`
Meteor.bindEnvironment(done.bind(null, routine))

// without `bind`
Meteor.bindEnvironment(function () {
done(routine);
});

________

bind 如何与 Meteor.bindEnvironment 一起工作?

最后,为了回答您的问题,bind 本身并不“与”任何东西一起工作。 Meteor.bindEnvironment获取提供给它的函数并将其绑定(bind)到由闭包维护的执行上下文,其中最初定义了方法 bindEnvironment

An explanation of the purpose of Meteor.bindEnvironment on GitHub :

The idea of bindEnvironment is so that, when passing callbacks to non-Meteor code, you can keep them running in the current context. On the server that includes the current fiber. So if you're finding yourself outside of a Fiber on the server, you're probably not calling bindEnvironment enough!

通过给它一个已经绑定(bind)的函数(作为箭头函数或通过手动传递 binded 函数),您可以防止它更改函数的执行上下文。

关于javascript - `bind` 如何与 `Meteor.bindEnvironment` 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32822823/

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