首页 > 试题广场 >

请问以上程序的输出是

[单选题]
function Foo(){
     var i=0;
     return function(){
         document.write(i++);
     }
}
var f1=Foo(),
f2=Foo();
f1();
f1();
f2();
请问以上程序的输出是
  • 010
  • 012
  • 000
  • 011
推荐
答案:A
这是一个闭包,闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。 
这里的局部变量i,对f1()来说是全局变量,对f2()来说也是全局变量,但是f1()的i跟f2()的i又是相互独立相互不可见的,f1()每执行一次,f1()的i就加一,f2()每次执行一次,f2()的i就加油,但是相互之间不影响,因此结果是010
编辑于 2015-01-28 10:08:55 回复(31)
A. 闭包 f1 和 f2 有不同的内存空间
发表于 2015-01-14 09:45:45 回复(1)
LYS头像 LYS
A,这是一个闭包,因为f1调用了两次,所以第二个是1
发表于 2015-04-03 19:04:35 回复(0)
闭包形成的环境以及举例,MDN上解释的很清楚了,而且很多示例可参考。
发表于 2019-06-24 09:31:37 回复(0)
首先Foo是一个函数,在函数内部声明的变量是局部变量,所以f1和f2访问的i是互补影响的变量i,其次后置++是先取值+所以f1第一次打印出的是0第二次打印出的是1而f2访问的i与f1无关,所以是0,如果此题把函数中的变量改成i=0答案会变成012
发表于 2018-08-02 19:11:52 回复(0)
1.当函数被创建时,内部[scope]属性被存储,在这个属性中保存一个包含全局变量对象的作用域链。
2.当函数被调用时,会创建一个执行环境及相应的作用域链,argument和实参为其进行初始化。
这里f1()函数和f2()函数在调用时会创建两个执行环境,保存各自的变量对象,结果是没有关系的。而同一个函数在多次调用时返回值会被保存在同一个变量对象中。
发表于 2015-07-21 09:06:28 回复(6)
f1(),f2()分别创建了自己的执行环境,所以它们两个是相互独立的,执行之后都会返回一个匿名函数,这个匿名函数的作用域链被初始化为其包含函数的活动对象(这里也就是i)和全局变量对象,f1执行之后i并不会销毁,因为返回的匿名函数还要引用i,i仍然在内存中,所以执行两次之后i的值变成了1,而f2执行之后i为0
发表于 2016-07-26 17:24:38 回复(1)
function Foo(){
     var i=0;
     return function(){
         console.log(i++);
     }
}
var f1=Foo(),
f2=Foo();
f1();//return i=1 输出0
f1();//return i=2 输出1
f2();//return i=1 输出0
发表于 2017-06-15 16:22:44 回复(7)
++运算符的使用,放在数字后表示后增,即先执行再+1,这里就是先执行console.log(i)之后i再加1,所以f1执行第二次的时候i已经变成了1,自然就输出1了。
发表于 2017-09-01 00:49:09 回复(0)
具体来说:
   第一步:因为f1=Foo(),
function Foo(){
     var i=0;
     return function(){
         document.write(i++);
     }
}
相当于 f1=function(){
    document.write(i++);//i++先用后加因此打印0
}
第二步:f1=Foo(),
    f1=function(){
    document.write(i++);//第二次调用这个函数,由于这个函数是在Foo内i被调用,垃圾回收机制没法实现,那么因为第一步的调用此时i=1;
}
第三步:f2=Foo()
   这是一个新的变量调用,前面的i已经被垃圾回收,因此i又是0了
发表于 2018-05-07 17:49:16 回复(2)
f1,f2是独立的作用域 i++ 先执行后加,所以第一次为0第二次为1
发表于 2018-01-12 23:05:32 回复(0)
函数属于引用数据类型,题目中f1,f2都等于函数赋值的结果,但是他们指向的是不同的地址空间,因此f1的结果的值不会对f2 造成影响。 同时由于是闭包的结构,如果只调用一次Foo(),并不能得到return中函数的返回值,因此f1()其实等价于Foo()(),第一次调用f1(),得到的结果是0(++在后,表示先输出再加1),第二次调用f1(),输出结果为1,因为上一次的调用让i+1。由于f1和f2没有关系,因此f2()执行的结果为0。
发表于 2021-10-13 11:44:59 回复(0)
这是一个闭包,闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。 
这里的局部变量i,对f1()来说是全局变量,对f2()来说也是全局变量,但是f1()的i跟f2()的i又是相互独立相互不可见的,f1()每执行一次,f1()的i就加一,f2()每次执行一次,f2()的i就加油,但是相互之间不影响,因此结果是010
发表于 2021-11-23 20:52:10 回复(0)
有谁给解答一下,谢谢! 每次调用Foo(),第一行那个var i=0不是每次都把i置零了吗?
发表于 2019-03-17 22:24:02 回复(6)
没有人疑问,执行document.write()后会重写整个页面吗?为什么会是追加.
原因: 一个页面加载完毕文档就关闭了,此时如果document.write()就会打开文档,那么之前的页面就会重写.   原因是用document.close();使文档关闭,而后再写入就会重写,在close前则是追加  
发表于 2018-03-25 12:08:44 回复(0)
F 的每一次调用,都会产生一个新的执行上下文(执行上下文中包含了在函数中声明的变量,在这里是 i),因此两次 F 调用的 i 是独立的。
发表于 2018-03-09 20:38:24 回复(0)
这题考察的是闭包和 i++ 运算符。

闭包会创建一个独立的内存空间,里面的变量是不会共享的。因此f1() 和 f2()是互相独立的。
发表于 2020-11-24 11:36:25 回复(0)
hxx头像 hxx
闭包中被引用的变量不会被回收,f1,f2函数执行时创建了各自的活动对象用来保存变量,互不干扰
发表于 2017-11-19 05:28:35 回复(0)
function Foo() {
  // 由于闭包的存在,i 所在的上下文环境不会被释放掉
  var i = 0
  // 在函数中定义了一个函数,这里相当于实现了一个闭包
  return function () {
    document.write(i++) // 这里的 i++ 表示:先打印 i ,然后 i = i + 1
  }
}

var f1 = Foo(),
  f2 = Foo()

// f1 打印多次,但始终修改的是同一个 i
f1()
f1()
// 注意 f2 和 f1 是两个不同的函数实例,
// 她与 f1 维护的上下文环境是隔离的,
// 即 f2 中操作的 i 和 f1 中操作的 i 不是同一个
f2() 

编辑于 2022-05-05 15:12:47 回复(0)
闭包函数内存无法释放,两个独立的函数形成两个独立的储存空间,下次调用时继续执行
发表于 2021-08-06 10:30:53 回复(0)
闭包就是一个函数,函数内部能访问到外界的变量,这就叫做闭包,为了体现闭包的作用一般使用双层函数嵌套而不会直接把变量定义在全局
闭包能保存变量的值在内存中不释放
发表于 2021-06-26 17:23:05 回复(0)