为什么自定义函数引用指向旧函数

nit*_*rma 4 javascript

我在"javascript设计模式"中找到了这个例子,并与下面代码的行为相混淆

此代码创建自定义函数:

var scareMe = function () {
   alert("Boo!");
   scareMe = function () {
     alert("Double boo!");
  };
};
Run Code Online (Sandbox Code Playgroud)

现在我们将它引用到另一个变量

var prank = scareMe; 
Run Code Online (Sandbox Code Playgroud)

令人困惑的部分是当我打电话恶作剧它应该更新scareMe时,当我回电话它应该警告"双嘘"不是吗?

但结果是

prank(); // "Boo!"
prank(); // "Boo!"
Run Code Online (Sandbox Code Playgroud)

如果我检查scareMe功能确实已经重新定义.

scareMe(); // Double boo!
Run Code Online (Sandbox Code Playgroud)

恶作剧只是对scareMe的参考,而不是为什么会有差异?

Esa*_*ija 6

prank不是引用scareMe(这在javascript中是不可能的),它是对函数对象的引用.2个变量独立地指代相同的功能.

该函数显式覆盖scareMe指向的内容.它不会prank以任何方式影响.

看这个:

scareMe = function() {
    alert("Double boo!");
};
Run Code Online (Sandbox Code Playgroud)

这没有什么神奇之处,它将重新分配最接近的scareMe变量,这恰好是全局变量.它没有做任何其他事情.

  • @niteshsharma这就是我试图解释的.你是误会,没有任何东西会给"恶作剧"分配任何东西(你没有看到"恶作剧=什么东西`所以怎么可以'恶作剧'改变?)因此它没有改变. (2认同)

JJJ*_*JJJ 5

prank指向原始功能,而不是scareMe.

看看这个例子:

var scareMe = 1;
var prank = scareMe;

scareMe = 2;
Run Code Online (Sandbox Code Playgroud)

你不期望改变scareMe会改变prank,对吗?它与功能完全相同.

var scareMe = function() { alert( 'Boo' ); };
var prank = scareMe;

scareMe = function() { alert( 'Double boo!' ); };
Run Code Online (Sandbox Code Playgroud)

在这方面,整数和函数之间没有区别 - prank即使在scareMe更改时也保持不变.那scareMe是从内部改变另一个功能并没有改变这个事实.

混淆可能来自于通常如何使用对象.改变原始函数并不常见,因为您可能会更改对象的属性.

var scareMe = { message: 'Boo' };
var prank = scareMe;

scareMe.message = 'Double boo!';

alert( prank.message );  // alerts 'Double boo!'
Run Code Online (Sandbox Code Playgroud)

这不是您在原始示例中使用函数所做的事情.将变量更改为指向完全不同的函数不会更改其他变量中的函数引用.