来自MDN :
The bind() method creates a new function that, when called, has its this keyword set to the provided value
我可以很高兴地看到它在这个例子中工作:
(function () {
console.log(this);
}).bind({foo:"bar"})();
记录 Object { foo="bar"}。
但是,如果我链接另一个绑定(bind)调用,甚至是“call”调用,我仍然会使用分配给传递给第一个绑定(bind)的对象的“this”来调用函数。示例:
(function () {
console.log(this);
}).bind({foo:"bar"}).bind({oof:"rab"})();
&
(function () {
console.log(this);
}).bind({foo:"bar"}).call({oof:"rab"});
两者都记录 Object { foo="bar"} 而不是我期望的:Object { oof="rab"}。
无论我链接了多少个绑定(bind)调用,似乎只有第一个有效。
为什么?
这可能会有所帮助。我刚刚发现 jQuery 版本的行为方式相同! :O
jQuery.proxy(
jQuery.proxy(function() {
console.log(this);
},{foo:"bar"})
,{oof:"rab"})();
记录 对象 { foo="bar"}
最佳答案
很容易将bind 视为以某种方式修改 函数以使用新的this。在这种(不正确的)解释中,人们认为 bind 是向函数添加某种魔法标志,告诉它在下次调用时使用不同的 this。如果真是这样,那么应该可以“覆盖”并更改魔法标志。那么有人会问,为什么要任意限制这样做的能力?
但事实上,它不是它是如何工作的。 bind 创建并返回一个新 函数,该函数在被调用时会调用具有特定 this 的第一个函数。这个新创建的函数使用指定的 this 调用原始函数的行为在创建函数时被嵌入。它无法更改,就像函数返回的任何其他函数的内部结构在事后无法更改一样。
查看 bind 的真正简单实现可能会有所帮助:
// NOT the real bind; just an example
Function.prototype.bind = function(ctxt) {
var fn = this;
return function bound_fn() {
return fn.apply(ctxt, arguments);
};
}
my_bound_fn = original_fn.bind(obj);
如您所见,bound_fn 中的任何地方,从bind 返回的函数,是否引用绑定(bind)函数的this被称为。它被忽略了,所以
my_bound_fn.call(999, arg) // 999 is ignored
或
obj = { fn: function () { console.log(this); } };
obj.fn = obj.fn.bind(other_obj);
obj.fn(); // outputs other_obj; obj is ignored
因此我可以“再次”绑定(bind)从bind 返回的函数,但那是不重新绑定(bind)原始函数;它只是绑定(bind)外部函数,这对内部函数没有影响,因为它已经设置为使用传递给 bind 的上下文(this 值)调用底层函数>。我可以一次又一次地绑定(bind),但我最终所做的只是创建更多的外部函数,这些函数可能绑定(bind)到某些东西,但最终仍会调用从第一个 bind 返回的最内层函数。
因此,说bind“不能被覆盖”是有点误导的。
如果我想“重新绑定(bind)”一个函数,那么我可以在原来的函数上做一个新的绑定(bind)。所以如果我绑定(bind)了一次:
function orig() { }
my_bound_fn = orig.bind(my_obj);
然后我想安排用其他一些this调用我的原始函数,然后我不重新绑定(bind)绑定(bind)函数:
my_bound_fn = my_bound_fn.bind(my_other_obj); // No effect
相反,我只是创建一个绑定(bind)到原始函数的新函数:
my_other_bound_fn = orig.bind(my_other_obj);
关于javascript - 在 JavaScript 中链接 .bind() 调用。意想不到的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26545549/
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf