首页 > 其他分享 >add方法在return的适时候就形成了一个闭包,包含n=4399这个值,这个n不是result和result2里的属性值n。两个不同对象的闭包是彼此独立的,不互相影响

add方法在return的适时候就形成了一个闭包,包含n=4399这个值,这个n不是result和result2里的属性值n。两个不同对象的闭包是彼此独立的,不互相影响

时间:2023-11-16 14:22:04浏览次数:27  
标签:闭包 4399 return 作用域 result2 4400 add result test

在浏览器控制台中执行以下代码,输出的结果是

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

A
4400 4401 4399 4400

B
4400 4401 4401 4402

C
4400 4400 4399 4400

D
4400 4401 4399 4402

E
4400 4401 4401 4400

正确答案:A

这个题其实挺有难度的不知道为啥没人写解析
test构成了一个闭包,result跟result2各自有自己的test作用域,所以最后result2.add()结果是4400
前两个没啥好说的,懵逼点在第三个,这里{n:n}是对变量n里的值进行缓存,而不是本身n这个指针变量,
这样生成add的时候n指向的值是多少{n:n}里的值就是多少

js在执行之前,会将所有带var和function的进行提前定义和声明。(带var的提前声明,function声明和定义都完成了)

首先,在全局作用域下,进行预解释:
test=xxxfff000(开辟一个堆内存,里面存的是代码字符串)
var result(声明一个变量result)
var result2(声明一个变量result2)

代码执行:
result=test() -->将test执行的返回结果赋值给result,是一个对象,再开辟一个堆内存,test执行,形成一个私有作用域A
再进行预解释和代码执行等一系列操作
result2=test() 同理

result.add() -->方法执行形成一个私有作用域

n++ 顺着作用域链向上寻找到test作用域A(A这个作用域不销毁,因为被全局变量result占用了)中的n为4399,n++ 》4400

(这时test这个作用域A下的n变成4400)

(1) console.log(n) //4400

==============================

result.add() -->方法执行形成一个新的私有作用域

n++ 顺着作用域链向上寻找到test作用域(A)中的n为4400,n++ 》4401

(2) console.log(n) //4401

===============================

(3) console.log(result.n) //4399
此时找的只是result对应的那个堆内存中的n

===============================

result2.add() -->方法执行形成一个私有作用域
n++ 顺着作用域链向上寻找到test作用域(B)中的n为4399,n++ 》4400

(3) console.log(n) //4400

形成了不同的作用域,所以访问到的n 也是不一样的 如果想要test里面的n跟着add() 一块加1 可以添加一行 this.n ++

函数每调用一次重新执行函数体中的所有代码一次,函数调用的结果是return的返回值。
在本题中函数test的返回值是一个对象,每调用一次就返回一个新的对象,所以reslut1与result2是两个不同的对象。
对象的属性和方法只有该对象自己能够使用,对象内部的方法不能够通过属性名或者方法名来使用同一对象内部的其它属性值或者方法
因此,前面reslut.add()对reslut指向的对象里面的属性'n:4399'没有影响

add方法在return的适时候就形成了一个闭包,包含n=4399这个值,这个n不是result和result2里的属性值n。两个不同对象的闭包是彼此独立的,不互相影响

标签:闭包,4399,return,作用域,result2,4400,add,result,test
From: https://www.cnblogs.com/longmo666/p/17836122.html

相关文章

  • 在forEach中使用 return false 或者 break无法跳出整个循环,并且使用break会直接报错
    执行以下程序,输出结果为()vararr=[2,1,3,5,9];varcount=0;arr.forEach((val1,val2)=>{count++;if(count%3==0){return;}console.log(val1);})A21B01C0134D2159正确答案:Darr.forEach()是......
  • 11月15日函数作用域和闭包函数
    目录1.函数作用域1.全局作用域(GlobalScope):2.闭包函数1.函数作用域js内的函数作用域与python内的作用域是一样的。查找顺序:首先在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层。1.全局作用域(GlobalScope):全局作用域是在整个程序中都可以访问的作用域。......
  • 闭包函数:1.函数内部定义函数 2.内部函数使用了非它作用域的参数。
    执行以下程序,输出结果为()functionouter(){varnum=0;functioninner(){num++;console.log(num);}returninner;}varf1=outer();f1();f1();varf2=outer();f2();f2();A1234B111......
  • docker异常unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain
    docker重装启动异常 INFO[2021-03-09T15:06:20.839195000+08:00]Loadingcontainers:start.INFO[2021-03-09T15:06:20.885624800+08:00]stoppingeventstreamfollowinggracefulshutdownerror="<nil>"module=libcontainerdnamespace=mobyINFO[2021-......
  • 闭包返回的是个方法,所以1式其实是btn.onclick=b();b没有执行
    执行以下程序,下列选项中,说法正确的是()<button>点击</button><script>functiona(){console.log(1);returnfunctionb(){console.log(2);}}varbtn=document.querySelector('button');btn.onclick=a();...①btn.onclick=a;...②......
  • 闭包产生的条件:内部函数使用外部变量+外部函数被调用(满足)
    下列关于闭包描述正确的是?()A闭包内变量执行后不会被清除B闭包不满足链式作用域结构C(Function(){})()理论上是一个闭包D闭包不耗内存,可以随意使用正确答案:AC可以用(function(){})()来构成闭包,而不是(function(){})()是闭包。这个要明确直接写(function(){vara=1......
  • 在构造函数里面,如果不写return的话默认就是返回创建的实例对象
    如果以下程序的输出结果是false,则①式可以替换为()consttest={rules:false};functionBuild(){this.rules=true;①}constbuild=newBuild();console.log(build.rules);Areturnfalse;Breturnthis.rules;Creturntest;D什么都不做正确答......
  • Java中关于try...catch的return规则
    本部分针对有return要求的异常捕获和处理,具体的,try...catch语句存在于方法体中。方法体中的try...catch的return总共有四种可能的地方:try,catch,finally,方法体末尾(try…catch外)。共存规则finally中的return和方法return不能同时存在。(显而易见的第一法则!)try中的return......
  • 以下对闭包(closure)理解正确的有 ABCD
    以下对闭包(closure)理解正确的有ABCDA闭包是指有权访问另一个函数作用域中变量的函数;B函数内再嵌套函数,返回到外部形成闭包;C内部函数可以引用外层的参数和变量D参数和变量不会被垃圾回收机制回收闭包的作用​ 1可以读取函数内部的变量​ 2可以把变量始终保存在内......
  • 《流畅的Python》 读书笔记 第7章_函数装饰器和闭包
    第7章函数装饰器和闭包装饰器这个名称可能更适合在编译器领域使用,因为它会遍历并注解句法树函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。这是一项强大的功能,但是若想掌握,必须理解闭包如果你想自己实现函数装饰器,那就必须了解闭包的方方面面,因此也就需......