你的位置:首页 > Java教程

[Java教程]我觉得有意思的JavaScript题目(01


对于以下js题目均来至于网络中。有的来至于文章之中,有的也许来至于问答题型中。

如果你有更好的问题解释,请留言交流!

 

1.相关问题描述:到底该怎么去理解闭包?

代码片段A:

!function(){  var num=1;  var exp={};  functionadd(num){    return num++;  }   exp.getAddNum=function(){    return add(num);  }  window.a=exp;}()console.log(a.getAddNum()); // 1console.log(a.getAddNum()); // 1

代码片段B:

!function(){  var num=1;  var exp={};  functionadd(){    return num++;  }  exp.getAddNum=function(){    return add();  }  window.a=exp;}()console.log(a.getAddNum()); // 1console.log(a.getAddNum()); // 2

 
解释:
第一个里面是你传递进去的,他会使用当前作用域接收到的这个形参的值,它并没有去改变外层num的值,因此你每次用它来传递,值都是1。
而第二个的'add'方法中并没有num变量,他会通过作用域链找到外层的num,那么你这样调用时每次都是操作的外层变量的值,而这个值在你return之后是会累加的。
关于上下文和作用域链你可以看看这篇文章
图解Javascript上下文与作用域 :http://blog.rainy.im/2015/07/04/scope-chain-and-prototype-chain-in-js/
 

2.javascript关于闭包的面试题

functionf1(){    var n=999;    nAdd=function(){n+=1}    functionf2(){      alert(n);    }    return f2;  }  var result=f1();  result(); // 999  nAdd();  result(); // 1000

问:

在这段代码中,result()它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。为什么会这样呢?尤其是第二次,为何输出的不是999呢?
nAdd=function(){n+=1}又起到了什么作用呢?

 

解释:

首先f1 函数的作用域链。1 指向全局,2 指向自身。自身里面包括,n=999 f2, nAdd这个函数没有加var声明,是全局变量。但是里面的n引用的是f1内部的n=999

然后 f2函数的作用域链。1 指向全局 2 指向f1的作用域 3,指向自己作用域

nAdd这个作用域链 1 指向全局,2 持有n=999引用,(我觉得也指向f1作用域),3 指向自己作用域

执行 var result=f1(); 这个楼主应该清楚,就是result就是指向f2函数
调用 result();弹出n.就是先去自己作用域找。没有。然后就去上级作用域f1里找。找到了。n=999,弹出999
执行nAdd(),这时,去自己作用域里找。没有n,所以去上级作用域。f1里。发现n,执行n=n+1,n变1000
再次执行result();和上一次一样。就是先去自己作用域找。没有。然后就去上级作用域f1里找。找到了 这时n=1000了。所以弹出1000

 

3.[] 和 Array 调用 slice 方法引起的问题

问题表示:在某些场景下,需要将函数的 arguments 参数作为一个数组调用,但是 arguments 是一个奇异对象,所以试着将 arguments 转化为一个数组;

functionargToArr(){  return [].slice.call(arguments, 0);}console.log(argToArr(1,2,3));  //[1,2,3]functionargToArr(){  returnArray.slice.call(arguments, 0);}console.log(argToArr(1,2,3));  //[]

问:

这是为什么呢?
另外还有一个问题,是关于 Array 是怎么找到 slice 方法的。
Array 本身是没有 slice 方法,它的方法在 Array.prototype 中,而我们在调用 slice 方法的时候,如果在 Array 本身没有找到 slice 方法的话,会通过它的原型链往上查找,而 Array.proto 并没有指向 Array.prototype,而是指向 Function(),那么它是怎么找到 slice 方法的呢?

解释:

第二段代码报错是因为Array是构造函数,不是对象,打开控制台,输入 typeof Array,结果是 function
你也说了slice()方法在其原型对象中,而[]就是Array的原型对象,在控制台中输入 Array.prototype,结果是[],所以第一段代码可以顺利执行。

第二段代码如下修改就可以了:

functionargToArr(){  returnArray.prototype.slice.call(arguments, 0); // 改这一行}console.log(argToArr(1,2,3));  

其实你的本质问题就在于误认为Array是数组对象,然而它是构造函数。

 

其它题目更新中。

 

作者:风雨后见彩虹

出处:http://www.cnblogs.com/moqiutao/

如果您觉得本文对您的学习有所帮助,请多支持与鼓励。


 




到韩国旅游要多少钱韩国旅游路线韩国旅游多少钱跟团韩国旅游网韩国特价旅游东方水世界五一门票价格?五一到杭州东方水世界泡温泉多少钱? 株洲方特门票学生票价格?株洲方特学生票多少钱? 株洲方特欢乐世界学生票多少钱?株洲方特学生什么时候优惠? 长沙火车站到株洲方特大巴几点发车?长沙火车站到株洲方特汽车在哪坐? 澳门半岛有什么旅游景点? 去澳门旅行除了买钜记手信还有其它选择吗? 五月份去香港的海洋公园玩,有什么设施好玩? 澳门最便宜住宿是在哪里?一般是多少钱呢? 曼谷天铁怎么收费?怎么坐天铁? 去新加坡旅游可以带什么纪念品回来? 廊曼机场怎么去曼谷市区?怎么去清迈? 现在迪拜天气怎么样啊?适合什么时候去游玩? 南沙水鸟世界电话?广州南沙水鸟世界怎么收费? 南沙水鸟世界门票团购多少钱?广州南沙水鸟世界怎样预订? 南沙水鸟世界好不好玩?广州南沙水鸟世界有哪些好玩的? 2015珠海春季赏花的好去处?珠海去哪里赏牡丹花? 0402YJ100GBSTR\500 Datasheet 0402YJ100GBSTR\500 Datasheet 1808CC393ZAT9A Datasheet 1808CC393ZAT9A Datasheet 0402YJ100GBSTR Datasheet 0402YJ100GBSTR Datasheet 名山大川图片 名山大川图片 名山大川图片 澳门一天旅游攻略 澳门一天旅游攻略 澳门一天旅游攻略 黄山旅游注意 黄山旅游注意 黄山旅游注意