美文网首页
javaScript中的作用域

javaScript中的作用域

作者: locky丶 | 来源:发表于2019-03-31 10:57 被阅读0次

变量的作用域

新建一个 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)

相关文章

网友评论

      本文标题:javaScript中的作用域

      本文链接:https://www.haomeiwen.com/subject/sabivqtx.html