Skip to content

Commit 7190d0c

Browse files
committed
commit
1 parent 55d5293 commit 7190d0c

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

chapter4.markdown

+56
Original file line numberDiff line numberDiff line change
@@ -388,4 +388,60 @@ JavaScript中的回调模式已经是我们的家常便饭了,比如,如果
388388

389389
## 自定义函数
390390

391+
我们动态定义函数,并将函数赋值给变量。如果将你定义的函数赋值给已经存在的函数变量的话,则新函数会覆盖旧函数。这样做的结果是,旧函数的引用就丢弃掉了,变量中所存储的引用值替换成了新的。这样看起来这个变量指代的函数逻辑就发生了变化,或者说函数进行了“重新定义”或“重写”。说起来有些拗口,实际上并不复杂,来看一个例子:
392+
393+
var scareMe = function () {
394+
alert("Boo!");
395+
scareMe = function () {
396+
alert("Double boo!");
397+
};
398+
};
399+
// using the self-defining function
400+
scareMe(); // Boo!
401+
scareMe(); // Double boo!
402+
403+
当函数中包含一些初始化操作,并希望这些初始化只执行一次,那么这种模式是非常适合这个场景的。因为能避免的重复执行则尽量避免,函数的一部分可能再也不会执行到。在这个场景中,函数执行一次后就被重写为另外一个函数了。
404+
405+
使用这种模式可以帮助提高应用的执行效率,因为重新定义的函数执行的更少。
406+
407+
>这种模式的另外一个名字是“函数的懒惰定义”,因为直到函数执行一次后才重新定义,可以说它是“某个时间点之后才存在”,简称“懒惰定义”。
408+
409+
这种模式有一种明显的缺陷,就是之前给原函数添加的功能在重定义之后都丢失了。如果将这个函数定义为不同的名字,函数赋值给了很多不同的变量,或作为对象的方法使用,那么新定义的函数有可能不会执行,原始的函数会照旧执行(译注:由于函数的赋值是引用的赋值,函数赋值给多个变量只是将引用赋值给了多个变量,当某一个变量定义了新的函数,也只是变量的引用值发生变化,原函数本身依旧存在,当程序中存在某个变量的引用还是旧函数的话,旧函数还是会依旧执行)。
410+
411+
让我们来看一个例子,scareMe()函数在这里作为一等对象来使用:
412+
413+
1. 给他增加了一个属性
414+
2. 函数对象赋值给一个新变量
415+
3. 函数依旧可以作为方法来调用
416+
417+
看一下这段代码:
418+
419+
// 1. adding a new property
420+
scareMe.property = "properly";
421+
422+
// 2. assigning to a different name
423+
var prank = scareMe;
424+
425+
// 3. using as a method
426+
var spooky = {
427+
boo: scareMe
428+
};
429+
430+
// calling with a new name
431+
prank(); // "Boo!"
432+
prank(); // "Boo!"
433+
console.log(prank.property); // "properly"
434+
435+
// calling as a method
436+
spooky.boo(); // "Boo!"
437+
spooky.boo(); // "Boo!"
438+
console.log(spooky.boo.property);
439+
440+
// "properly"
441+
// using the self-defined function
442+
scareMe(); // Double boo!
443+
scareMe(); // Double boo!
444+
console.log(scareMe.property); // undefined
445+
446+
391447

0 commit comments

Comments
 (0)