使用函数声明时的自定义函数(也称为惰性函数定义)
self-defining function(also called lazy function definition) when using function declaration
在Stoyan Stefanov的"JavaScript Patterns"一书中,有一部分是关于自定义函数的。
var scareMe = function(){
console.log("Boo!");
scareMe = function(){
console.log("Double Boo!");
}
}
scareMe();//==>Boo!
scareMe();//==>Double Boo!
它按我的预期工作。但是我修改了scareMe功能,如下所示:
function scareMe(){
console.log("Boo!");
function scareMe(){
console.log("Double Boo!");
}
}
scareMe();//==>Boo!
scareMe();//==>Boo!
问题:
- 它们之间有什么区别?
- 在第二种情况下,为什么输出不是"Double Boo!",而是"Boo!
调用
时的第一个scareMe
函数通过在内部创建另一个scareMe
来覆盖自己的行为,该函数覆盖了上部作用域中的函数,因此原始scareMe
的定义发生了变化,如果您想在应用程序中进行第一次设置并希望在设置后立即更改其行为,我已经看到使用了这种方法。
如果您定义了:
var scareMe = function(){
console.log("Boo!");
var scareMe = function(){ //define it with var
console.log("Double boo!");
}
}
scareMe();//==>Boo!
scareMe();//==>Boo! //you will see the behavior as that of the second one.
也是一次性设置的一个实际实现:
var scareMe = function(){
console.log("Boo!");
//I have done my job now. I am no longer needed.
scareMe = undefined;
}
scareMe();//==>Boo!
scareMe();//==> oops error
第二种情况是创建一个名为 scareMe
的新函数,其作用域仅在函数内,它不会覆盖自身。
例如,尝试一下:
function scareMe(){
console.log("Boo!");
function scareMe(){
console.log("Double bool!");
}
scareMe(); //Now this invokes the once defined inside the scope of this function itself.
}
scareMe();//==>Boo! and Double bool!
在你的第一个应用程序中,scareMe是一个全局变量(在你的上下文中)。在"双嘘"中,您更改该全局变量的值,因此它可以工作。在第二个应用中,内部 scareMe 是一个局部变量,它不会改变全局变量的值。所以这是关于变量范围。
除了提升和可调试性之外,您还可以考虑:
function f(/* ... */) { /* ... */ }
等效于:
var f = function(/* ... */) { /* ... */ };
如果我们将您的第二个代码示例转换为使用第二种形式,我们将得到:
var scareMe = function() {
console.log("Boo!");
var scareMe = function() {
console.log("Double bool!");
};
};
请注意,这与第一个代码段不同;内部函数定义有一个var
。使用内部var
,它创建一个名为scareMe
的新变量,该变量遮蔽了外部变量。
相关文章:
- 用嵌套函数和默认函数定义函数
- 使用Extjs进行函数定义
- JS中奇怪的函数定义语法
- 重写javascript函数定义
- 使用角度图时,我可以用函数定义数据点颜色吗
- modal.js中的匿名函数定义
- 为从AJAX调用中utlizes DATA参数的函数定义回调
- Emacs:在 etag 中查找函数定义
- Javascript:对象函数定义
- 为什么要在函数定义之外引用静态变量(函数属性)
- Ember 对象函数定义中的计算属性.js
- javascript/jQuery中函数定义的区别
- CoffeeScript 承诺与函数定义链接
- 如何在使用 eval() 评估 JavaScript 时将回调函数定义作为参数传递
- Javascript - 为什么下面的函数定义错误
- 使用函数声明时的自定义函数(也称为惰性函数定义)
- JavaScript 函数定义不正确
- jQuery off on 时是用匿名函数定义的
- 停止 IntelliJ 11 在启用 JSLint 时向每个嵌套函数定义添加“use strict”
- 为什么不是't我为这个函数定义的javascript函数