变量的作用域
新建一个 js 文件,添加如下代码
var a
在 web 中,a 的位置是 window.a
在 node 中,a 的位置是 global.a
修改 js 文件
var a = 5
function foo() {
var b = 6
console.log(a) // >5
}
foo()
console.log(b) // >b is not defined
当 b 被申明在函数中时,b 在全局中是找不到的。说明函数有自己单独的作用域,不与全局作用域共享,但可以获取到全局变量。
如果在变量前不加var,那函数内的变量也是能访问的,如下
function foo () {
b =4
}
foo()
console.log(b) // >4
接着我们来看下常用的 if 和 for 的情况
var a = 5
function foo() {
if (a) {
var c = 6
}
console.log(c) // >6
}
foo()
function foo() {
var i, a = 1
for (i = 0; i < 2; i++) {
var b = 5
a++
}
console.log(b) // >5
}
foo()
以上代码说明了 if、for 没有单独的作用域,变量在{}外也能被获取到。
函数的作用域 (闭包)
普通函数就不多做介绍了,我们主要聊聊闭包。
简单来说,函数内的函数都是闭包。
function foo() {
var a =5
function bar(){
// doSomeThing
}
}
以上代码中,bar() 函数就是闭包。我们常用的回调函数也都是闭包,如 setTimeOut(function(){},1000) ,setInterval(function(){},1000)
闭包内的函数是不能被全局调用的,这样可以保证函数命名不会起冲突。
function foo() {
var a =5
function bar(){
var b = a+6
console.log(b)
}
}
bar() // >bar is not defined
如果我们要在全局调用 bar()函数,需要用到 return
function foo() {
var a = 5
function bar() {
var b = a + 6
console.log(b) // >11
}
return bar
}
foo()()
对象内引用函数
通过执行 foo()函数得到了 b,但是 foo()()会让我们摸不着头脑,需要再改进下,用对象来写会有更好的可读性。
var myfoo = {
a: 5,
mybar: function bar() {
var b = this.a + 6
console.log(b) // >11
}
}
myfoo.mybar()
mybar() // >mybar is not defined
立即调用函数(立即执行函数)
还有一种调用函数的方式,它不需要我们重复函数名,可以直接调用函数自身
(function foo() {
var a = 5
function bar() {
var b = a + 6
console.log(b) // >11
}
return bar
})()()
foo() // > foo is not defined
这种函数比较特殊,它也是闭包的一种,在外部是无法调用到该函数的。
变量的生命周期
JavaScript 变量生命周期在它声明时初始化。
局部变量在函数执行完毕后销毁。
全局变量在页面关闭后销毁。
函数参数
函数参数只在函数内起作用,是局部变量。
(function foo() {
var a = 5
function bar(c) {
var b = a + 6 + c
console.log(b) // >13
}
return bar
})()(2)
网友评论