@@ -672,32 +672,30 @@ JavaScript中的回调模式已经是我们的家常便饭了,比如,如果
672672说到这里,要特别提醒一下关于浏览器探测的事情。当你使用这个模式的时候,不要对浏览器特性过度假设。举个例子,如果你探测到浏览器不支持` window.addEventListener ` 时,不要假设这个浏览器是IE,也不要认为它不支持原生的` XMLHttpRequest ` ,虽然这个结论在整个浏览器历史上的某个时间点是正确的。当然,也有一些情况是可以放心地做一些特性假设的,比如` .addEventListener ` 和` .removeEventListerner ` ,但是通常来讲,浏览器的特性在发生变化时都是独立的。最好的策略就是分别探测每个特性,然后使用条件初始化,使这种探测只做一次。
673673
674674
675- ---------校对分割线---------
676- <a name =" a21 " ></a >
677- ## 函数属性——Memoization模式
675+ ## 函数属性——记忆模式(Memoization)
678676
679- 函数也是对象,所以它们可以有属性。事实上,函数也确实本来就有一些属性。比如,对一个函数来说,不管是用什么语法创建的,它会自动拥有一个length属性来标识这个函数期待接受的参数个数 :
677+ 函数也是对象,所以它们可以有属性。事实上,函数也确实本来就有一些属性。比如,对一个函数来说,不管是用什么语法创建的,它会自动拥有一个 ` length ` 属性来标识这个函数期待接受的参数个数 :
680678
681679 function func(a, b, c) {}
682680 console.log(func.length); // 3
683681
684- 任何时候都可以给函数添加自定义属性。添加自定义属性的一个有用场景是缓存函数的执行结果(返回值),这样下次同样的函数被调用的时候就不需要再做一次那些可能很复杂的计算。缓存一个函数的运行结果也就是为大家所熟知的Memoization 。
682+ 任何时候都可以给函数添加自定义属性。添加自定义属性的一个有用场景是缓存函数的执行结果(返回值),这样下次同样的函数被调用的时候就不需要再做一次那些可能很复杂的计算。缓存一个函数的运行结果也就是为大家所熟知的记忆模式 。
685683
686- 在下面的例子中,myFunc函数创建了一个cache属性,可以通过myFunc.cache访问到。这个cache属性是一个对象 (hash表),传给函数的参数会作为对象的key,函数执行结果会作为对象的值。函数的执行结果可以是任何的复杂数据结构:
684+ 在下面的例子中,` myFunc ` 函数创建了一个 ` cache ` 属性,可以通过 ` myFunc.cache ` 访问到。这个 ` cache ` 属性是一个对象 (hash表),传给函数的参数会作为对象的key,函数执行结果会作为对象的值。函数的执行结果可以是任何的复杂数据结构:
687685
688686 var myFunc = function (param) {
689687 if (!myFunc.cache[param]) {
690688 var result = {};
691- // ... expensive operation ...
689+ // ……复杂的计算……
692690 myFunc.cache[param] = result;
693691 }
694692 return myFunc.cache[param];
695693 };
696694
697- // cache storage
695+ // 缓存
698696 myFunc.cache = {};
699697
700- 上面的代码假设函数只接受一个参数param,并且这个参数是基本类型 (比如字符串)。如果你有更多更复杂的参数,则通常需要对它们进行序列化。比如,你需要将arguments对象序列化为JSON字符串,然后使用JSON字符串作为cache对象的key :
698+ 上面的代码假设函数只接受一个参数 ` param ` ,并且这个参数是原始类型 (比如字符串)。如果你有更多更复杂的参数,则通常需要对它们进行序列化。比如,你需要将 ` arguments ` 对象序列化为JSON字符串,然后使用JSON字符串作为 ` cache ` 对象的key :
701699
702700 var myFunc = function () {
703701
@@ -706,18 +704,18 @@ JavaScript中的回调模式已经是我们的家常便饭了,比如,如果
706704
707705 if (!myFunc.cache[cachekey]) {
708706 result = {};
709- // ... expensive operation ...
707+ // ……复杂的计算……
710708 myFunc.cache[cachekey] = result;
711709 }
712710 return myFunc.cache[cachekey];
713711 };
714712
715- // cache storage
713+ // 缓存
716714 myFunc.cache = {};
717715
718716需要注意的是,在序列化的过程中,对象的“标识”将会丢失。如果你有两个不同的对象,却碰巧有相同的属性,那么他们会共享同样的缓存内容。
719717
720- 前面代码中的函数名还可以使用arguments.callee来替代 ,这样就不用将函数名硬编码。不过尽管现阶段这个办法可行,但是仍然需要注意,arguments.callee在ECMAScript 5的严格模式中是不被允许的 :
718+ 前面代码中的函数名还可以使用 ` arguments.callee ` 来替代 ,这样就不用将函数名硬编码。不过尽管现阶段这个办法可行,但是仍然需要注意,` arguments.callee ` 在ECMAScript5的严格模式中是不被允许的 :
721719
722720 var myFunc = function (param) {
723721
@@ -726,16 +724,17 @@ JavaScript中的回调模式已经是我们的家常便饭了,比如,如果
726724
727725 if (!f.cache[param]) {
728726 result = {};
729- // ... expensive operation ...
727+ // ……复杂的计算……
730728 f.cache[param] = result;
731729 }
732730 return f.cache[param];
733731 };
734732
735- // cache storage
733+ // 缓存
736734 myFunc.cache = {};
737735
738736
737+ ---------校对分割线---------
739738<a name =" a22 " ></a >
740739## 配置对象
741740
0 commit comments