zoukankan      html  css  js  c++  java
  • js经典试题之闭包

    js经典试题之闭包

    1:以下代码输出的结果是?

    function Foo(){
         var i=0;
         return function(){
             document.write(i++);
         }
    }
    var f1=Foo(),
    f2=Foo();
    f1();
    f1();
    f2();
    

    答案:0 1 0

    解析: 这是一个闭包,闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。 
    这里的局部变量i,对f1()来说是全局变量,对f2()来说也是全局变量,但是f1()的i跟f2()的i又是相互独立相互不可见的,f1()每执行一次,f1()的i就加一,f2()每次执行一次,f2()的i就加1,但是相互之间不影响,因此结果是0

    2:以下代码输出的结果是?

    function test() {
    	var n = 4399
    	function add() {
    		n++
    		console.log(n)
    	}
    	return {n:n, add:add}
    }
    var result1 = test()
    var result2 = test()
    result1.add()
    result1.add()
    console.log(result1.n)
    result2.add()
    

    答案:4400 4401 4399 4400

    解析:

    test构成了一个闭包,result跟result2各自有自己的test作用域,所以最后result2.add()结果是4400

    前两个没啥好说的,懵逼点在第三个,这里{n:n}是对变量n里的值进行缓存,而不是本身n这个指针变量,这样生成add的时候n指向的值是多少{n:n}里的值就是多少(这里返回的对象是个深拷贝)

  • 相关阅读:
    访问虚拟机
    w3school JavaScript 简介
    蘑菇街2016研发工程师在线编程题
    乐视2017暑期实习生笔试题(二)
    今日头条2017后端工程师实习生笔试题
    c# 读取 excel文件内容,写入txt文档
    处理字符串
    XML获取节点信息值
    SVN仓库目录结构
    sql 知识点
  • 原文地址:https://www.cnblogs.com/momozjm/p/7760102.html
Copyright © 2011-2022 走看看