- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 bind
与 Meteor.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.
________
在您提供的示例中没有 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)的函数(作为箭头函数或通过手动传递 bind
ed 函数),您可以防止它更改函数的执行上下文。
关于javascript - `bind` 如何与 `Meteor.bindEnvironment` 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32822823/
我在尝试在 Meteor.com 上托管的经历非常复杂。 我经常收到“此网站已关闭。稍后再试。”。一开始我不知道为什么,但后来我怀疑问题是我不小心恢复了“system.users”集合造成的。我尝试在
我有点好奇,与复制 Meteor 应用程序、启动 tmux session 并仅运行 meteor 相比,Meteor Up(或其他 Meteor 应用程序部署过程,如 Modulus)是否能做任何花
我与meteor 合作创建了一个应用程序。在 meteor Meteor.methods 和 Meteor.publish 用于执行数据库操作。 I know use of Meteor method
我有一个相当大的 meteor 项目并安装了几个 meteor 包。我这样做只是为了试用一个 meteor 包,看看它是否适用于我的项目。不幸的是,在确定我不需要在我的项目中安装这些包后,我没有卸载这
对于生产为什么我应该“捆绑” meteor 应用程序而不仅仅是复制 服务器上的源使用“ meteor ”命令? 基本上有什么区别: “meteor bundle app.tar.gz”,然后安装正确版
我是 Meteor 的新手,我想知道我们如何要求用户在创建帐户时上传他的图片?我正在使用基本的 Meteor 帐户来创建用户帐户。我希望用户能够上传他的图片,并且还能够在他登录时和在我网站的登录页面上
我正在学习 Meteor Angular 2 教程。在第 6 步,我随机尝试了“ meteor 更新”,这使我的样本崩溃了。更新有效,服务器正在启动。然而,浏览器屏幕现在保持空白,并且在控制台中出现错
在我的 meteor app我需要实现表格排序。现在我正在做的是设置一个 session variable对于每个列并根据要排序的项目切换其值。 任何人都可以提出更好的选择吗? 最佳答案 我推荐 表格
我向用户发送了注册电子邮件,当他输入密码和其他详细信息时,我试图重置密码,但它抛出错误 uncaught error extpected to find a document to change 正如
我运行排行榜示例。然后我更改了 leaderboard.js 中的 names 变量(Meteor.startup 函数参数初始化的一部分)中的科学家条目之一并保存了文件。 我应该期待 meteor
我有一个 meteor 1.0 应用程序。我添加了一堆包,例如:meteor add kevohagan:ramda .但我在任何地方都找不到它。我什至无法在我的系统上找到它。 在我的项目中: $>
我有一个 meteor 移动应用程序在结构上工作;我真的需要将 View 与一些页面转换拼接在一起。 我看了iron-transitioner项目,但看起来开发已经停止? (最后一次提交 6 个月前,
我在“发现 meteor ”一书之后构建了我的第一个 meteor 添加。 但是我现在遇到了以下错误: 错误:在ian:accounts-ui-bootstrap-3 中没有找到accounts_ui
是否可以在负载均衡器后面使用 Mongodb 运行 meteor 应用程序的多个实例? 似乎如果一个应用程序的多个实例在不同的服务器上运行,那么它们就不会知道其他实例对 Mongo DB 所做的更改
我在/client/main.coffee 中的新客户端代码 Xingyun = Meteor.connect "localhost:3000" System = new Meteor.Collect
在 Meteor.publish ,使用 this.error 有什么区别并简单地抛出 Meteor.Error ? 最佳答案 this.error仅在发布方法内可用。每 the docs : Sto
假设我想在 Meteor 的后端使用与 Mongo 不同的数据库,并且还想在前端使用像 D3.js 这样的可视化库。 目前有可能吗? 如果不是我自己添加它会有多复杂? 谢谢 最佳答案 https://
我已经在 Meteor 中制作了一个 watch-as-I-type 实时聊天服务,但是我在 Meteor 中的内置元素保存功能方面遇到了麻烦。基本上,当输入的文本具有焦点时,我需要不更新当前的聊天消
我想知道 Meteor 是否可以与我的用例一起使用。 我有一个可在 App Store 上使用的移动应用程序。这个应用程序包含一个小调查,用户将在没有互联网连接的情况下做出回应。然后用户将关闭应用程序
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我是一名优秀的程序员,十分优秀!