标签:
对于以下js题目均来至于网络中。有的来至于文章之中,有的也许来至于问答题型中。
如果你有更好的问题解释,请留言交流!
!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
!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
return
之后是会累加的。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
问题表示:在某些场景下,需要将函数的 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/
如果您觉得本文对您的学习有所帮助,请多支持与鼓励。
标签:
原文地址:http://www.cnblogs.com/moqiutao/p/4764722.html