我在"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的参考,而不是为什么会有差异?
prank不是引用scareMe(这在javascript中是不可能的),它是对函数对象的引用.2个变量独立地指代相同的功能.
该函数显式覆盖scareMe指向的内容.它不会prank以任何方式影响.
看这个:
scareMe = function() {
alert("Double boo!");
};
Run Code Online (Sandbox Code Playgroud)
这没有什么神奇之处,它将重新分配最接近的scareMe变量,这恰好是全局变量.它没有做任何其他事情.
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)
这不是您在原始示例中使用函数所做的事情.将变量更改为指向完全不同的函数不会更改其他变量中的函数引用.
| 归档时间: |
|
| 查看次数: |
585 次 |
| 最近记录: |