先上代码:
var scope = 'global scope';
function checkscope(){
var scope = 'local scope';
function f(){return scope;}
return f();
}
checkscope();
输出:local scope
如果把这段代码改一下,把里面的括号移动到外面:
var scope = 'global scope';
function checkscope(){
var scope = 'local scope';
function f(){return scope;}
return f;
}
checkscope()();
输出:local scope
我的问题:
1.这段代码到底是要干什么?
2.为什么代码会返回local scope而不是global scope?
3.为什么把f后面的()移动到外面还是返回一样的值?f没了括号,return f是什么意思呢?
4.js里面是不是只要是var申明的都是局部变量,没有var的都是全局变量?
5.最后一个问题,我看了网上的不少闭包的文章,但是还是对于闭包这个概念不是太懂,只知道闭包就是里面的函数可以访问外面的函数的成员变量,但是反过来不行,有哪位大神可以举几个通俗易懂的例子帮我理解下到底什么事闭包吗?
谢谢各位啦!:D
你的问题提得很清晰,说明你是经过认真思考了的,那么我也将试着认真一一回答:(序号对应问题答案)。
1.首先你可以认为你定义了一个checkscope函数,加入这是一个工具类,别人需要引用的时候,肯定不知道你内部用了什么变量,这就涉及到一个作用域的问题。至于作用很简单,就是函数内部可以访问外部全局变量,函数外部不能直接访问函数内部局部变量,所以你在用一个模块的时候不会取到模块的局部变量,你不妨直接这样看看:
2.函数内部定义的scope只能在内部调用,但是外部的变量在函数内部可以访问,你不妨试试把这个改成这样试试:
会发现外部的scope是可以用的,这个地方之所以没有影响是因为函数内部变量覆盖了。
3.这个问题问得不错,其实自己调试一下就知道,如下:
这个问题之所以不清楚,我觉得是对于函数定义的几种方式理解不到位:
第二种方式可以认为是讲函数赋值给一个变量,因为函数也是对象,你上面例子中返回f,其实可以认为就是类似于函数定义的第二种。
4.你的意思肯定是想问是不是函数作用域中,如果不加var是不是内部变量变成了全局变量,这种情况下是的,但是如果不是函数作用域,比如代码块之间,加不加var都可以认为是全局的,所以还是要明确js是函数作用域。
5.至于闭包,这个我觉得还是还是要理解js函数作用域,然后就是匿名函数和闭包的区别,可以看看这篇匿名函数与闭包的区别;然后再看看这一篇吧:学习Javascript闭包。
如果想进一步理解,可以看看我这篇文章中的一部分内容:
JavaScript进阶学习(二)—— 基于原型链继承的js工具库的实现方法。