尽管我阅读了那么多文章,但我仍然有一些疑问。
我已经知道(并理解)闭包的用法,例如:
臭名昭著的循环问题(链接循环,每个链接都有警报,并保留编号)
增加计数器(继续调用一个函数 -> 提醒增加的数字)
来自 here :
inner functions referring to local variables of its outer function create closures
来自 here :
a closure is the local variables for a function - kept alive after the function has returned, or a closure is a stack-frame which is not deallocated when the function returns. (as if a 'stack-frame' were malloc'ed instead of being on the stack!)
请问3个问题:
问题#1
有人告诉我,JS 中的所有函数都会创建闭包。
什么 ???如果我用私有(private)变量创建一个普通函数,它只会创建一个范围。不是关闭。
我认为闭包是这样工作的:( from here )
- Make an outer, "function maker" function.
- Declare a local variable inside it.
- Declare an inner function inside the outer one.
- Use the outer function's variable inside the inner function.
- Have the outer function return the inner function
- Run the function, and assign its return value to a variable
例子:
function functionMaker(){
var x = 1;
function innerFunction(){
alert(x);
x++;
}
return innerFunction;
}
那么为什么他们说每个 js 函数都会创建闭包?
问题#2
Self-Invoking Functions aka IEFA - Immediately Invoked Function Expression 是否创建闭包?
看着
(function (a) {
alert(a);
})(4);
我没有看到像上面的 6 条规则 这样的模式:
Have the outer function return the inner function 到底在哪里?我没有看到 return 这个词。
问题#3
function myFunction() {
var myVar = 1;
var alertMyVar = function () {
alert('My variable has the value ' + myVar);
};
setTimeout(alertMyVar, 1000 * 3600 * 24);
}
myFunction();
myFunction 是否在这里存活了一整天?或者它在 setTimeout 之后立即结束?如果是这样,SetTimeOut 是如何记住那个值的?
请帮我把它弄好。
最佳答案
所有函数调用 都会创建一个闭包。需要注意的重要一点是闭包是否持续到函数调用的生命周期之后。
如果我执行一个立即执行的函数:
var value = (function() {
return 4;
})();
然后创建一个闭包,但在函数返回时丢弃。为什么?因为没有幸存的对闭包中定义的符号的引用。但是在这里:
var value = function() {
var counter = 0;
return function() {
return counter++;
};
}();
闭包在立即执行的函数之后继续存在,因为它返回另一个 函数,而该函数又包含对原始函数中定义的“计数器”符号的引用。因为返回的函数仍然“活着”,所以闭包必须由运行时系统保留。
这里注意:
var value = function() {
return function(a) {
return "hello " + a;
};
}();
即使外部立即执行的函数返回一个函数,该函数不引用外部函数的任何符号,因此无需保留闭包。
我想我想说的是,将闭包视为执行函数效果的一部分而不是严格地作为静态的结构性事物是有帮助的。可能有一个函数有时会创建持久闭包,但并非总是如此。
关于Javascript 关闭说明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13495991/
下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11
转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev
一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
多年来,我在各种网站上遇到过各种问题,用户在字符串和文本字段的开头/结尾放置空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来不对,但实际上并非如此),有时它们实际上会使应用程序崩溃。我认为这会很有用,而不是像我过去所做的那样放入一堆before_save回调,向ActiveRecord添加一些功能以在保存之前自动调用任何字符串/文本字段上的.strip,除非我告诉它不是,例如do_not_strip:field_x,:field_y或类定义顶部的类似内容。在我去弄清楚如何做到这一点之前,有没有人看到更好的解决方案?明确一点,我已经知道我可以做到这一点:befor
使用ruby的watir测试网络应用程序时,浏览器最后会保持打开状态。网上的一些建议是,要进行真正的单元测试,您应该在每次测试时(在拆卸调用中)打开和关闭浏览器,但这很慢而且毫无意义。或者他们做这样的事情:defself.suites=superdefs.afterClass#Closebrowserenddefs.run(*args)superafterClassendsend但这会导致摘要输出不再显示(诸如“100次测试、100次断言、0次失败、0次错误”之类的内容仍应显示)。我怎样才能让ruby或watir在我的测试结束时关闭浏览器? 最佳答案
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
我想设置秒数aflash在自动关闭之前向用户显示通知。 最佳答案 您可以在页面上使用一些简单的JavaScript(在此示例中使用jQuery):$('document').ready(function(){setTimeout(function(){$('#flash').slideUp();},3000);});假设保存您的flash消息的HTML元素的id是#flash,这将向上滑动并在3000毫秒(3秒)后将其隐藏。 关于ruby-on-rails-如何在一段时间后关闭Rails
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文