草庐IT

JavaScript 对象文字符号与普通函数和性能影响?

coder 2024-05-08 原文

假设我有这样的功能:

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 上作为“方法”可用。这可能是为了方便,用于“命名空间”等。在您的第一种形式(以及我上面的第一种形式)中,如果该代码在全局范围内, foobar被添加到全局范围,它会很快变得非常拥挤(尤其是在浏览器上)。在您的第二个示例中,唯一的全局符号是 Baz 因为函数是匿名的。在我上面的最后一个例子中,唯一的全局符号是 Baz 但函数不是匿名的,它们有调试器和堆栈跟踪可以显示给你的名字(这是一个很好的东西; more here ).

就在函数创建时进行优化而言,它是这样工作的:当执行进入给定的上下文(全局上下文,或与调用函数相关的上下文)时,这些东西是完成:

  1. 创建幕后执行上下文对象。
  2. 为该执行上下文创建一个幕后变量对象
  3. 在函数上下文的情况下:
    1. arguments 的变量对象中添加了一个属性(可用于访问参数的类似数组的东西)
    2. 一个属性被添加到每个函数的命名参数的变量对象中,具有参数的值
    3. 如果函数有名称,则其名称作为变量对象的属性添加,并具有函数对象的值。
  4. 在执行上下文中为每个用 var 声明的变量在变量对象上创建属性;它们的值最初是 undefined(不管 var 是否有初始化器)。
  5. 处理上下文中的每个函数声明。 (函数表达式还没有被处理;更多关于下面的区别。)每个函数名称的变量对象的属性被创建并接收函数对象作为它的值。
  6. 逐步代码执行开始。
    • 与所有表达式一样,函数表达式会在分步流程中遇到时进行计算。
    • 具有初始值设定项的
    • var 语句(例如,var a = 2;)被视为与赋值语句(a = 2;)完全相同;它的 var 方面很早就完成了。 (varfrequently 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/

有关JavaScript 对象文字符号与普通函数和性能影响?的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如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以想要的样式转储标量?解

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  6. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  7. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  8. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  9. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务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

  10. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

随机推荐