javascript - 给大家出一道关于JS闭包和赋值的题,希望大家分析一下?

查看:124
本文介绍了javascript - 给大家出一道关于JS闭包和赋值的题,希望大家分析一下?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

第一部分

案例一

var num=1;
function f(){
  
  return function(){
  
    num++;
    console.log(num);
  };
}
var c=f();
c();
c();
var d=f();
d();
d();
console.log(c===d);

结果是:

console:
2
3
4
5
false

案例二

function f(){
  var num=1;
  return function(){
  
    num++;
    console.log(num);
  };
}
var c=f();
c();
c();
var d=f();
d();
d();
console.log(c===d);

结果是:

Console 
2
3
2
3
false

案例三

function f(){
  
  return function(){
    var num=1;
    num++;
    console.log(num);
  };
}
var c=f();
c();
c();
var d=f();
d();
d();
console.log(c===d);

结果:

console
2
2
2
2
false 


第二部分

案例一

 var num={a:1};
function f(){
  
  return function(){
   
    num.a=2;
    return num;
  };
}
var c=f()();
console.log(c);


var d=f()();
console.log(d);

c.a=5;
console.log(c);
console.log(d);


console.log(c===d); 

结果:

console
[object Object] {
  a: 2
}
[object Object] {
  a: 2
}
[object Object] {
  a: 5
}
[object Object] {
  a: 5
}
true  

案例二

function f(){
  var num={a:1};
  return function(){
   
    num.a=2;
    return num;
  };
}
var c=f()();
console.log(c);


var d=f()();
console.log(d);

c.a=5;
console.log(c);
console.log(d);

console.log(c===d);

结果:

console
[object Object] {
  a: 2
}
[object Object] {
  a: 2
}
[object Object] {
  a: 5
}
[object Object] {
  a: 2
}
false

案例三

function f(){
  
  return function(){
    var num={a:1};
    num.a=2;
    return num;
  };
}
var c=f()();
console.log(c);


var d=f()();
console.log(d);

c.a=5;
console.log(c);
console.log(d);

console.log(c===d);

结果:

console
[object Object] {
  a: 2
}
[object Object] {
  a: 2
}
[object Object] {
  a: 5
}
[object Object] {
  a: 2
}
false  


  • 请留意console.log的值。

  • 请留意在第一部分我只是改变了var num=1出现的位置以造成不同的闭包情况,同样第二部分我只是改变了var
    num={a:1}出现的位置以造成不同情况的闭包。

  • 到底什么情况下c和d才会是===? c和d相等实际是什么?词法环境还是什么相等?

  • 各个console值出现的原因? 请具体些分析,不妨从js代码解析、闭包等深层次的原因分析


等你来挑战!!!

解决方案

回答下第一部分,其余部分道理一样。
知识点: 变量作用域 作用域链 引用类型
案例一:num属于全局变量,所有的num变量均是这一个值。所以每次num++,便会修改num的值。至于c === d 这是两个不同的函数,所在内存的引用不同自然也就是false。
案例二: num放在了函数内部,函数返回的匿名函数便形成了闭包,上面提过c 与 d 代表的是两个不同的函数,各自有各自的num变量,当外部函数f()执行完毕后,由于内部闭包的存在,该变量并不会被释放。所以num会被累加。
案例三: num处于f()返回的匿名函数内部,没有产生闭包,该函数调用完毕后会被释放。

这篇关于javascript - 给大家出一道关于JS闭包和赋值的题,希望大家分析一下?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆