Closures - Javascript
Closures - Javascript
因为回调的行为就像它们实际上被放在函数中一样,所以它们实际上是闭包:它们可以访问包含函数的变量和参数,甚至可以访问全局范围链接中的变量。正确的但如果我这样做:
function fullName(firstName, lastName, callback){
var f_scope = "X";
console.log("My name is " + firstName + " " + lastName);
callback(lastName);
}
var greeting = function(ln){
console.log('Welcome Mr. ' + ln);
console.log(f_scope);//<<---error
};
fullName("Jackie", "Chan", greeting);
另一方面,如果greeting
在fullName
内部,则不会发生错误。所以回调不是100%像放在函数内部一样吗?正确的
他们可以访问包含函数的变量和参数
词汇包含。他们可以从定义函数的范围访问变量,而不是从调用函数的范围中访问变量。JS中的函数确实形成了词法闭包,没有动态作用域。
该f_scope
变量既不是全局变量,也不是在包含greeting
的函数中声明的。
因为回调的行为就像它们实际上被放置在函数中一样
在函数中定义的回调行为就像在函数中一样。在函数外部定义的回调行为就好像它们是在函数之外定义的一样。
他们实际上是关闭
它们在理论上是闭包,在实践中也是。不同之处在于它们所涵盖的内容。
var x = 1;
function externalCallback() {
// closes over x, someFunction, externalCallback
}
function someFunction() {
var y = 2;
var internalCallback = function() {
// closes over x, someFunction, externalCallback, internalCallback, y
}
setTimeout(externalCallback, 0);
setTimeout(internalCallback, 0);
}
看看这个例子:
function callback_caller(callback) {
var x = 7;
callback();
}
function func1() {
var y = 9;
function inner_func() {
// console.log('x', x); // <-- this would not work
console.log('y', y); // <-- this is ok
}
return inner_func;
}
var callback = func1();
callback_caller(callback); // prints: y 9
当调用inner_func
时,包含变量y
的func1
早已不在,但inner_func
仍然可以访问它。这是因为y
在闭包中。
另一方面,x
与inner_func
无关,在那里永远不可用。
fullName位于根上下文中,因此它可以看到自己和"问候语"。
fullName然后创建"f_scope",它只在fullName内部可见。
根上下文使用firstName、lastName和callback调用fullName。firstName和lastName仅在fullName上下文中可用,因为params是函数的本地/私有变量。
fullName然后调用回调,回调接受一个param,ln,恰好是fullName中的lastName param/变量,但它是作为param传递的,而不是直接访问。
f_scope对fullName是私有的,因此,不能在greeting内部调用它,如果将其作为函数的参数,则可以将其传递给greeting。
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 使用php或javascript从facebook相册URL中删除多余的部分
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在JavaScript中将字符串转换为函数引用
- 模糊事件的Javascript测试
- Javascript更改图标
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如何使用WCF服务和javascript表单post上传.doc文件
- javascript结合了数组和字典
- 这是什么 ==- javascript 运算符
- 从javascript创建一个列表
- Javascript Closure: Pratical Closures example in MDN
- Javascript Closures
- Closures - Javascript
- javascript closures onreadystatechange
- Closures javascript vs java
- Javascript Closures (Object literal Vs Constructor based)
- Javascript Closures vs Object.createProperty