简单的闭合困境
Simple closure dilemma
我试图对JavaScript的闭包有更好的基本理解
假设我们在 Node 中有这两种不同的场景.js
function A(){
console.log(data); //this should give us a null pointer
}
module.exports = function(data){
return A;
}
对
module.exports = function(data){
return function A(){
console.log(data); // variable "data" will be remembered
};
}
为什么在第一种情况下变量"数据"没有被记住,而在后一种情况下,它被闭包"记住"了?
我确信在某些语言的某个地方,声明一个函数和一个引用一个函数可能都记得外部函数中的变量,但我想我想更好地理解其中的区别。
闭
包是关于词汇包含的。在这种情况下,"词汇"一词是指程序的文本结构,而"词汇包含"意味着一个结构在物理上位于"内部"或嵌套在另一个结构中。在 JavaScript 中,函数可以访问以词法包围(封闭(结构定义的变量。
因此,在以下方面:
function foo() {
var bar;
return function baz() {
console.log(bar);
};
}
函数baz
在词法上包含在foo
中,它定义了变量bar
,因此可以访问bar
。即使从其他位置返回和调用它,它仍可以访问bar
:
var fooFunc = foo();
fooFunc(); // continues to have access to bar
在您的示例中:
function A(){
console.log(data); //this should give us a null pointer
}
module.exports = function(data) {
return A;
}
A
无权访问 data
,因为它在词法上不包含在module.exports
行上定义的函数的上下文中,这是定义(或在本例中传入(data
的位置。
您在第二种情况下对变量data
使用闭包,这就是为什么它为您提供正确结果的原因。
在第一种情况下,你只是返回函数A
,而不是关闭exports
中的变量data
。
因为在第一个示例中,两个data
不相关,并且彼此独立。
相关文章:
- 简单的javascript在Shopify中不起作用
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 如何制作简单的php'在Javascript中的foreach等价物
- JQuery:向多个匹配结果添加换行符的最简单方法
- AJAX简单错误.XMLHttpRequest无法加载http://localhost/mpl/getPage.php.
- Moment/Jquery-一个简单时间线的愚蠢问题
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 简单类测试未通过
- 简单地将拆分变量添加到对象中
- 通过javascript操作图像,非常简单
- 问题用moment JS制作一个简单的时间表
- 简单的ES6承诺问题-交换解决和拒绝参数
- 带有计数器、缩略图、进度条和淡入淡出效果的简单jQuery幻灯片
- 简单的JS函数.需要对变量进行澄清
- 简单的交换程序无法使用javascript
- 如何只使用特定的表行构建简单的手风琴
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- react路由器使用简单的javascript路由器配置来处理不匹配的路径
- 简单的JavaScript方法链接
- 简单的闭合困境