假设我有这样的功能:
function foo() {
}
function bar() {
}
我可以把上面写成对象字面量符号:
var Baz = {
foo: function() {
},
bar: function() {
}
};
据我所知,在后一种情况下,无论是否调用任何 Baz 函数,脚本加载时都会创建一个 Baz 实例。在前一种情况下,函数对象仅在调用该函数时创建。我对这些假设是否正确?
如果我是正确的,那么在很少调用这些函数的应用程序中,前者将比后者具有更高的性能(更少的内存)。 但后者的优势在于它提供了更大的模块化和更低的全局命名空间污染。
根据您的专业经验,您对此有何看法? 有速度差异吗?
最佳答案
In the former case, function object is only created when that function is called.
不,无论如何都会创建函数。
请注意,您也可以这样做:
function foo() {
}
function bar() {
}
var Baz = {
foo: foo,
bar: bar
};
或者这个:
var Baz = (function() {
function foo() {
}
function bar() {
}
return {
foo: foo,
bar: bar
};
})();
将函数作为属性放在 Baz 上的主要目的是使它们在 Baz 上作为“方法”可用。这可能是为了方便,用于“命名空间”等。在您的第一种形式(以及我上面的第一种形式)中,如果该代码在全局范围内, foo 和 bar被添加到全局范围,它会很快变得非常拥挤(尤其是在浏览器上)。在您的第二个示例中,唯一的全局符号是 Baz 因为函数是匿名的。在我上面的最后一个例子中,唯一的全局符号是 Baz 但函数不是匿名的,它们有调试器和堆栈跟踪可以显示给你的名字(这是一个很好的东西; more here ).
就在函数创建时进行优化而言,它是这样工作的:当执行进入给定的上下文(全局上下文,或与调用函数相关的上下文)时,这些东西是完成:
arguments 的变量对象中添加了一个属性(可用于访问参数的类似数组的东西)var 声明的变量在变量对象上创建属性;它们的值最初是 undefined(不管 var 是否有初始化器)。var 语句(例如,var a = 2;)被视为与赋值语句(a = 2;)完全相同;它的 var 方面很早就完成了。 (var 是 frequently misunderstood。例如,我们昨天有 this question。)您会注意到函数声明 和函数表达式 之间的区别。您可以通过查看您是否将结果用作右手值来判断哪个是哪个 - 也就是说,您是否将结果分配给变量,将其用作右侧对象文字中的属性定义,或将其传递给函数。如果是,它就是一个函数表达式。如果不是,它是一个函数声明。
函数声明示例:
function foo() {
}
函数表达式示例:
var foo = function() {
};
另一个:
var Baz = {
foo: function() { }
};
(foo 行是对象文字中的属性声明,它使用函数表达式作为值。)
命名函数表达式示例:
var f = function foo() { // <== Don't do this (more below)
};
命名函数表达式应该是有效的,但它们在野外实现(尤其是 IE)的支持很差,所以现在必须避免使用它们。 More here .
关于JavaScript 对象文字符号与普通函数和性能影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5754538/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了