1 回答
![?](http://img1.sycdn.imooc.com/533e4c9c0001975102200220-100-100.jpg)
TA贡献1826条经验 获得超6个赞
你的问题提得很清晰,说明你是经过认真思考了的,那么我也将试着认真一一回答:(序号对应问题答案)。
1.首先你可以认为你定义了一个checkscope函数,加入这是一个工具类,别人需要引用的时候,肯定不知道你内部用了什么变量,这就涉及到一个作用域的问题。至于作用很简单,就是函数内部可以访问外部全局变量,函数外部不能直接访问函数内部局部变量,所以你在用一个模块的时候不会取到模块的局部变量,你不妨直接这样看看:
var scope = 'global scope';function checkscope(){ var scope = 'local scope'; function f(){return scope;} return f(); } checkscope(); alert(scope); // global scope
2.函数内部定义的scope只能在内部调用,但是外部的变量在函数内部可以访问,你不妨试试把这个改成这样试试:
var scope = 'global scope';function checkscope(){ function f(){return scope;} return f(); } alert(checkscope());
会发现外部的scope是可以用的,这个地方之所以没有影响是因为函数内部变量覆盖了。
3.这个问题问得不错,其实自己调试一下就知道,如下:
var scope = 'global scope';function checkscope(){ var scope = 'local scope'; function f(){return scope;} return f; }var fn = checkscope();console.log(fn) // "function f(){return scope;}"console.log(typeof fn) // functionconsole.log(fn()) // "local scope"
这个问题之所以不清楚,我觉得是对于函数定义的几种方式理解不到位:
第一种:function fn(){ // 函数体} 第二种:var fn = function(){ // 函数体} 第三种:var fn = new Function(); 调用的时候都是有()的,fn()。
第二种方式可以认为是讲函数赋值给一个变量,因为函数也是对象,你上面例子中返回f,其实可以认为就是类似于函数定义的第二种。
4.你的意思肯定是想问是不是函数作用域中,如果不加var是不是内部变量变成了全局变量,这种情况下是的,但是如果不是函数作用域,比如代码块之间,加不加var都可以认为是全局的,所以还是要明确js是函数作用域。
5.至于闭包,这个我觉得还是还是要理解js函数作用域,然后就是匿名函数和闭包的区别,可以看看这篇匿名函数与闭包的区别;然后再看看这一篇吧:学习Javascript闭包。
如果想进一步理解,可以看看我这篇文章中的一部分内容:
JavaScript进阶学习(二)—— 基于原型链继承的js工具库的实现方法。
添加回答
举报