一 变量声明
js定义变量大家都知道是用var,这个var如果在全局,他可有可无,但是如果在函数内部那么就有点不一样了。当然最近看了看es6,里面有很多新语法挺好用的,其中就有一个叫let的定义变量方式,这个就只是拿来定义局部变量的,这里不展开。
言归正传,有如下语句:
请问在console中会打印出什么?答案是一个undefined!!!
我们改一下:
改成这样的话,它会给你一个123.
这其实就是var在作怪,js里,如果在函数内部定义变量必须加var,不然定义的是全局变量,就像我们改过的语句,在函数里声明了一个全局变量,然后给全局变量赋值,在外部自然而然就能得到这个值。
二 变量,函数声明提升
变量及函数的声明都将被提升到最顶部
即:
相当于:
变量x的声明被提升到了 最顶部,同理函数的提升(仅限于以声明的形式创建的函数,字面量式不会提升),这也就是你写的函数function xx(){}放在js的任何地方都可以调用,因为它被提升了。
三 闭包
这里顺便提一下闭包,因为和这个东东很像:
在说var定义变量的第一个例子上我们为什么得到的n不是123,而是undefined?,这就是因为js的链式作用的原因,外部的变量对内部可见,反之不通。当然第二个例子我们将其定义为全局的,那就不存在这些问题了。
如图:
这里的getTest函数就称之为闭包,因为链式作用的原因,外部我们无法访问内部的变量,那么刚才说过,内部可以访问外部的,那么我们是不是在其内部定义一个函数再return出来问题就解决了呢?是的,运行一下你会得到123.
网友评论