gpt4 book ai didi

javascript - 有关从 JavaScript 中的闭包返回对象字面量的详细信息

转载 作者:行者123 更新时间:2023-12-02 18:49:59 36 4
gpt4 key购买 nike

背景:我想重写一个库(不是我编写的)以避免闭包编译器使用高级选项生成警告。根据这个问题JavaScript “this” keyword and Closure Compiler warnings答案是使用闭包重写代码。目的是避免使用关键字 this(它会生成编译器警告)。

由于该库有许多函数,我认为新的闭包最好返回一个对象文字。我想了解这是如何运作的以及任何可能的后果。因此,我写了以下(无意义)示例作为学习练习(也在这里:jsFiddle):

  var CurrencyObject = function(Amount) {
var money = Amount;
return {
"toCents": function() {
money *= 100;
return money;
},
"toDollars": function() {
money /= 100;
return money;
},
"currentValue": money // currentValue is always value of Amount
};
}; // end currencyObject

var c1 = CurrencyObject(1.99); // what's the difference if the syntax includes `new`?

alert('cents = ' + c1.toCents() + '\ncurrent money = ' + c1.currentValue + '\ndollars = ' + c1.toDollars() + '\ncurrent money = ' + c1.currentValue);

var c2 = CurrencyObject(2.99);

alert('cents = ' + c2.toCents() + '\ncurrent money = ' + c2.currentValue + '\ndollars = ' + c2.toDollars() + '\ncurrent money = ' + c2.currentValue);

alert('cents = ' + c1.toCents() + '\ncurrent money = ' + c1.currentValue + '\ndollars = ' + c1.makeDollars() + '\ncurrent money = ' + c1.currentValue);

问题1:为什么在调用toCentscurrentValue没有更新? (我猜这是因为 currentValue 是一个文字(?),它在第一次执行CurrencyObject时被初始化。如果是这样的话,返回属性的语法是什么>当前值?)

Q2:此语法(使用 new)var c1 = newCurrencyObject(1.99); 不会以某种方式改变代码的行为我可以检测到,但我认为存在差异。它是什么?

Q3:实例化c2时,是正在创建的函数的副本,还是c1c2共享相同的(功能)代码? (如果正在创建函数的副本,我需要进行哪些更改才能避免这种情况?)

TIA

顺便说一句:如果有人想知道,对象文字中的符号会被引用以避免闭包编译器重命名它们。

最佳答案

问题 1:您创建了两个变量,其中包含 Amount 的单独副本。其中之一是在闭包中捕获的 money 变量中。另一个副本位于返回对象的 currentValue 属性中。这些是相互之间没有联系的独立变量,除了 currentValue 的初始值是使用 money 变量的值初始化的。

要解决此问题,您必须只在一个位置存储 currentValue 并在那里引用它。您只能在闭包中使用 money 局部变量,但这需要将 currentValue 属性更改为 getter 函数(用于检索 money > value)而不是直接的数据属性。

或者,您可以去掉 money 闭包变量,只使用 currentValue 属性。这需要您使用 thistoCentstoDollars 方法中获取该属性。在我看来,更简洁的方法是后者(使用 this 来引用对象自己的属性)。我不知道为什么关闭不希望你这样做。

Q2:当您从构造函数显式返回一个对象时,无论是直接作为函数调用构造函数还是使用 new 运算符调用构造函数都不再重要。正如您所观察到的,两者都会产生相同的结果。

Q3:由于您的函数是匿名的,因此每个新实例化都会创建一个新的匿名函数对象。其效率如何取决于 JavaScript 的实现。您可以通过将函数声明为本地命名函数并引用该名称来使只有一个函数。然后,您可以保证不会创建任何新函数。

关于javascript - 有关从 JavaScript 中的闭包返回对象字面量的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13130014/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com