我正在尝试学习JS,关于javascript闭包,我有一个问题-
function fooOuter(){
var a = 10;
var b = 20;
return function fooinner(x){
return a + b + x;
};
}
这是否意味着Javascript中的内部函数存储了对同一作用域中所有变量的引用。也就是说,在这种情况下,fooinner存储变量a和b的引用。
我读过关于JavaScript闭包的超级帖子,在我找到的答案之间似乎有一些出入,我希望我能得到一些进一步的澄清。
线程中的一些答案是在内部函数引用外部函数的变量时创建闭包的。
我找到了另一个答案,说这是一个终结:
var a = 42;
function b() { return a; }
注意,这里没有内部/外部函数,而只是一个函数。person给出的解释是,闭包是函数引用外部作用域的时候。
所以我的问题是,只有当有两个函数(内函数和外部函数),或者函数引用外部作用域时才创建闭包,而外部作用域可能是函数,也可能不是函数(在本例中,它只是顶级作用域)?
看起来每个作用域都有很多var是浪费字节和不良的代码习惯。我不知道如何修复我的代码。如何按照JS好的做法编辑下面的行?
<script type="text/javascript">
// <![CDATA[
var jump_page = '{LA_JUMP_PAGE}:';
var on_page = '{ON_PAGE}';
var per_page = '{PER_PAGE}';
var base_url = '{A_BASE_URL}';
var
我对Javascript编程比较陌生。我正在编写一个示例,在从HTML调用对象的方法时遇到了困难。我怀疑这与方法的作用域或外部化有关,但我不确定。
index.html:
<script type="text/javascript">
var f = new Fred();
f.bar();
f.foo();
</script>
Fred.js:
function Fred() {
this.a = 1;
function foo() {
if (a == 1) {
a++;
}
var e = 0;
}
t
你能澄清我下面的误解吗?
如果JS中函数的执行上下文是在调用/调用函数时创建的,而不是在声明函数时创建的,那么在下面的代码中,内部是闭包吗?如果有,原因何在?inner还没有被调用,因为执行上下文是在调用时创建的,所以inner不可能存储对i的引用。
function foo(i) {
function inner() {
return i;
}
return inner;
}
var f = foo(3);
内部何时会引用foo的执行上下文?当它被调用时,还是在它被定义时?在上面的代码中,我还没有调用内部函数。
另外,如果您能解释一下JS在看到函数定义(与函数
考虑以下代码:
function nepaliBuddha() {
var a = 20;
return function buddhaNepal() {
console.log(a);
}
}
var closure = nepaliBuddha();
closure(); // logs 20
现在,当我们调用closure时,输出是20。这证明了内部作用域属性([[scope]])是分配给定义它的内部函数的,或者说,当declared.If在声明时没有分配时,就无法在不同的上下文中调用它时记录20。
调用closure()时,函数上
我有一个数组排序函数,如下所示:
public function sortAscending($accounts)
{
function ascending($accountA, $accountB) {
if ($accountA['AmountUntilNextTarget'] == $accountB['AmountUntilNextTarget']) {
return 0;
}
return ($accountA['AmountUntilNextTarget'
我的Node.js项目遭受内存泄漏,我已经在闭包中将变量设置为空,我的意思是,我知道这样的代码:
var a = 0;
var b = 1;
var c = 0;
example_func(c, func(){
console.log(b);
});
会导致内存泄漏,所以我添加了一些代码来将这些变量设置为null;
var a = 0;
var b = 1;
var c = 0;
example_func(c, func(){
console.log(b);
a = null;
b = null;
c = null;
});
但是我仍然有漏洞,所以我尝试
嘿,我在youtube 上看到了这段视频
这基本上解释了IIFE和闭包。但我不理解的是,我是否需要返回一个函数才能调用它。
E.x。
function a() {
var i = 10;
function b() {
alert(i);
}
}
在这种情况下,我是否可以将其称为闭包,因为它是从外部函数的作用域访问'i‘变量,或者我是否需要像这样返回函数
return function b(){alert(i);}
我正在做一门课程,内容包括范围/闭包,并简要提到垃圾收集。在课程中提出了一个问题:
范围在周围停留多长时间?答案是--直到不再有任何参考资料。是的,所以我们基本上说的是,闭包有点像引用一个隐藏的作用域对象。因此,只要有一些函数在作用域上仍然有一个闭包,这个作用域就会继续存在。但一旦关闭,范围就可以收集垃圾。“
var sum = function sumHndlr(x, y) {
if (y !== undefined) {
return x + y;
} else {
return function(y) {
r
我最近一直在读关于闭包的文章,我有点困惑,因此有几个问题。
所以我认为闭包就是当你在一个函数中使用一个变量的时候,这个变量位于你的直接词法作用域之外。我经常听到的另一个定义是..‘保留变量的副本,就像它们在函数完成执行之前一样’。
假设我有一个带有私有变量的函数:
function foo() {
var x = 'abc';
return function() {
return x;
}
}
var bar = foo();
console.dir(bar) // [[Scopes]] - 0: Closure { x: 'a
在“您不知道JS:作用域和闭包”一书中,凯尔辛普森说,块作用域变量有助于垃圾收集,下面是具体的示例:
function process(data) {
// do something interesting
}
{
let someReallyBigData = {};
process(someReallyBigData);
}
var btn = document.getElementById("my_button");
btn.addEventListener("click", function click(evt) {
console.log("
据我所知,在另一个函数中定义的函数A也可以访问B的局部变量。
function B() {
var x = 10;
function A() {
console.log(x); //will result in 10
var y = 5;
}
console.log(y); //ReferenceError: y is not defined
}
但是,在下面的示例中,y被打印出来。我知道javascript中没有"if块“的块作用域,但是声明至少应该在" if”之外不可见吗?我的意思是不应该仅限于if