闭包练习题(都会的话你闭包就一点问题都没有了)

注意要在浏览器环境下运行,不要在node环境下运行

不然结果会不一样的

// 1.
// console.log(a, b, c);
// var a = 12,
//   b = 13,
//   c = 14;
// function fn(a) {
//   console.log(a, b, c);
//   a = 100;
//   c = 200;
//   console.log(a, b, c);
// }
// b = fn(10);
// console.log(a, b, c);

// 2.
// var a = 1;
// var obj = {
//   name: "tom",
// };
// function fn() {
//   var a2 = a;
//   obj2 = obj;
//   a2 = a;
//   obj2.name = "jack";
// }
// fn();
// console.log(a);
// console.log(obj);

// 3.
// var a = 1;
// function fn(a) {
//   console.log(a);
//   var a = 2;
//   function a() {}
// }
// fn(a);

// 4.
// console.log(a);
// var a = 12;
// function fn() {
//   console.log(a);
//   var a = 13;
// }
// fn();
// console.log(a);

// ----

// console.log(a);
// var a = 12;
// function fn() {
//   console.log(a);
//   a = 13;
// }
// fn();
// console.log(a);

// ----

// console.log(a);
// a = 12;
// function fn() {
//   console.log(a);
//   a = 13;
// }
// fn();
// console.log(a);

//5.
// var foo = "hello";
// (function (foo) {
//   console.log(foo);
//   var foo = foo || "world";
//   console.log(foo);
// })(foo);
// console.log(foo);

//6. 函数是个渣男 每次遇到函数声明都要给之前的全局的变量把包补上
// {
//   function foo() {}
//   foo = 1;
//   console.log(foo);
// }
// console.log(foo);

// ----

// {
//   function foo() {}
//   foo = 1;
//   // 每次遇到这个就得重新买一下包
//   function foo() {}
// }
// console.log(foo);

// ----

// {
//   function foo() {}
//   foo = 1;
//   function foo() {}
//   foo = 2;
// }
// console.log(foo);

//7.
// var x = 1;
// function func(
//   x,
//   y = function anonymousl() {
//     x = 2;
//   }
// ) {
//   x = 3;
//   y();
//   console.log(x);
// }
// func(5);
// console.log(x);

// ----

// 不会
// var x = 1;
// function func(
//   x,
//   y = function anonymousl() {
//     x = 2;
//   }
// ) {
//   var x = 3;
//   y();
//   console.log(x);
// }
// func(5);
// console.log(x);

// 不会
// var x = 1;
// function func(
//   x,
//   y = function anonymousl() {
//     x = 2;
//   }
// ) {
//   var x = 3;
//   var y = function anonymousl() {
//     x = 4;
//   };
//   y();
//   console.log(x);
// }
// func(5);
// console.log(x);

// 二.闭包作用域的作业
//1.
// var a = 10,
//   b = 11,
//   c = 12;
// function test(a) {
//   a = 1;
//   var b = 2;
//   c = 3;
// }
// test(10);
// console.log(a, b, c);

//2.
// var a = 4;
// function b(x, y, a) {
//   console.log(a);
//   arguments[2] = 10;
//   console.log(a);
// }
// a = b(1, 2, 3);
// console.log(a);

//3. 代码要上往下执行
// var a = 9;
// function fn() {
//   a = 0;
//   return function (b) {
//     return b + a++;
//   };
// }
// var f = fn();
// console.log(f(5));
// console.log(fn()(5));
// console.log(f(5));
// console.log(a);

//4. alert(4)
// var test = (function (i) {
//   return function () {
//     alert((i *= 2));
//   };
// })(2);
// test(5);

//5.
// var x = 4;
// function func() {
//   return function (y) {
//     console.log(y + --x);
//   };
// }
// var f = func(5);
// f(6);
// func(7)(8);
// f(9);
// console.log(x);

//6.
// var x = 5,
//   y = 6;
// function func() {
//   x += y;
//   func = function (y) {
//     console.log(y + --x);
//   };
//   console.log(x, y);
// }
// func(4);
// func(3);
// console.log(x, y);

// 7. 
/* function fun(n, o) {
  console.log(o);
  return {
    fun: function (m) {
      return fun(m, n);
    },
  };
}
var c = fun(0).fun(1);
c.fun(2);
c.fun(3); */

/* 8. 简述你对闭包的理解,以及其优缺点?

    我认为闭包是函数的一种执行机制,在函数内部的函数
    可以访问到外部函数作用域中的变量,这就是闭包
    闭包的优点有保护变量以及保存变量,缺点是容易造成内存泄漏
    保护变量是指可以保护私有上下文中的私有变量和外界的变量没有任何的关系
    保存变量是指可以把私有变量还有它的值保存起来,供其下级上下文使用
    缺点:函数执行完后,函数内的局部变量没有释放,占用内存时间会变长,容易造成内存泄露
    解决:及时释放,主动解除引用
*/

/* 9.简述let和var的区别?
    
    - let 定义的变量需要先声明再使用,否则会报错 var定义的变量 会有变量提升 先声明再使用会返回undefined(暂时性死区)
    - var 定义的变量会挂载到window上,成为window对象一个属性,而let定义的变量不会
    - let 声明的变量具有块级作用域,而var声明的变量只有函数作用域
    - let 声明的变量不可以重复声明,否则会报错,而var可以

    补充:
    const命令两个注意点:

    - const 声明之后必须马上赋值,否则会报错
    - const 简单类型一旦声明就不能再更改,复杂类型(数组、对象等)指针指向的地址不能更改,内部数据可以更改。

*/

// 10.下面代码输出的结果是多少,为什么?如何改造一下,就能让其输出 20 10? 不会
// var b = 10;
// (function b() {
//   b = 20;
//   console.log(b);
// })();
// console.log(b);

// 11 实现函数fn,让其具有如下功能(百度二面)
// let res = fn(1, 2)(3);
// console.log(res); //=>6  1+2+3

// // 临时不释放
// function fn(x, y) {
//   x = x;
//   y = y;
//   return function (z) {
//     return x + y + z;
//   };
// }

// 三.this作业

// //1.
// var num = 10;
// var obj = {
//   num: 20,
// };
// obj.fn = (function (num) {
//   this.num = num * 3;
//   num++;
//   return function (n) {
//     this.num += n;
//     num++;
//     console.log(num);
//   };
// })(obj.num);
// var fn = obj.fn;
// fn(5);
// obj.fn(10);
// console.log(num, obj.num);

//2.
// let obj = {
//   fn: (function () {
//     return function () {
//       console.log(this);
//     };
//   })(),
// };
// obj.fn();
// let fn = obj.fn;
// fn();

//3.
// var fullName = "language";
// var obj = {
//   fullName: "javascript",
//   prop: {
//     getFullName: function () {
//       return this.fullName;
//     },
//   },
// };
// console.log(obj.prop.getFullName());
// var test = obj.prop.getFullName;
// console.log(test());

//4.
// var name = "window";
// var Tom = {
//   name: "Tom",
//   show: function () {
//     console.log(this.name);
//   },
//   wait: function () {
//     var fun = this.show;
//     fun();
//   },
// };
// Tom.wait();

//5.
// window.val = 1;
// var json = {
//   val: 10,
//   dbl: function () {
//     this.val *= 2;
//   },
// };
// json.dbl();
// var dbl = json.dbl;
// dbl();
// json.dbl.call(window);
// alert(window.val + json.val);

//6.
// (function () {
//   var val = 1;
//   var json = {
//     val: 10,
//     dbl: function () {
//       val *= 2;
//     },
//   };
//   json.dbl();
//   alert(json.val + val);
// })();

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值