谈谈一道js笔试题,涉及作用域链、闭包
来源:互联网 发布:唐小僧 知乎 编辑:程序博客网 时间:2024/06/10 21:01
题如下,让你写出输出结果:
function test(){ var n=4399; function add(){ n++; console.log(n); } return {n:n,add:add} // 一个匿名变量}var result=test(); // var result2=test();//result.add();//4400 result.add();//4401console.log(result.n);//4399result2.add();4400
先说说return {n:n,add:add},可能一开始看到很懵逼,其实这就是一个匿名对象。冒号前面的n是属性名,后面的n是值。并且属性n的值n是一个number,也就是基本类型,它是不会变的,除非被重新赋值!!!但是add的值也就是add函数,是引用类型值,是会随着函数的多次调用,而改变其结果。
var result=test();这里的test()就是得到了return的{n:n,add:add},并将该值存入result的堆内存。这时的n值还是4399,为什么不是4400呢,不是有n++吗?很简单,因为add函数没有被调用过,因此n没有+1。
var result2=test();基本与上面相同,不同的是存入了不同的堆内存。因此,result和result2相互独立。
这里多说一句,如果是:var result2=result; 则result2的值不是纯粹的{n:n,add:add},而是存着指向{n:n,add:add}的指针,因此result和resut2指向同一个对象,是相互影响的。
result.add(); 调用了add函数,n++执行了,所以是4400。注意,这里的add函数是闭包,保存了自己的作用域链。add中的要用的n值是test函数中的n值,即向上追溯作用域链。
因此,这里的add函数可以等价于
function add(){ var n=4399; n++; console.log(n);}
result.add(); 结果4401,不解释了。
console.log(result.n) 还是4399,刚才说了,属性n存的是基本类型值,不变。
result2.add(); 因为result和result2指向两个不同的对象(虽然表达式是相同的),有不同的作用域链
- 谈谈一道js笔试题,涉及作用域链、闭包
- js作用域链,js闭包
- 记录一道JS笔试题
- js--闭包,作用域链
- js的闭包与作用域/作用域链
- 简述JS作用域、作用域链和闭包
- JS作用域、作用域链与闭包详解
- js作用域,作用域链以及闭包
- 【JS】作用域、闭包
- js 作用域、闭包
- js 闭包作用
- js 闭包作用
- js 闭包作用
- js 闭包作用
- js 作用域链&内存回收&变量&闭包
- Js函数深入理解-作用域链与闭包
- js作用域链和闭包的理解
- JS基础知识:变量对象、作用域链和闭包
- php中函数前加&符号的作用
- 二叉树各类操作
- mysql设置密码与远程访问
- android判断EditText字母开头
- python 内置函数 locals()和 globals()
- 谈谈一道js笔试题,涉及作用域链、闭包
- Hue安装与问题解决方案
- ThinkPHP导出百万条数据量
- 高级篇 I: 作业的配置、注册、调度
- setSupportActionBar(toolbar);导致出错的原因
- ORA-01658: 无法为表空间space中的段创建 INITIAL 区解决办法
- UDP主要丢包原因及具体问题分析
- Mangos源码分析(6):登录服的设计之功能需求
- maven settings.xml详解