资讯专栏INFORMATION COLUMN

作用域与提升

idisfkj / 464人阅读

摘要:在当中,只存在函数作用域和全局作用域,而块级作用域是不存在的。作用域中作用域分为两种,分别是全局作用域函数作用域其中全局作用域指的是在一个文件中的作用域。

JavaScript中和C语言、Java这些语言不一样。在JavaScript当中,只存在函数作用域全局作用域,而块级作用域是不存在的。刚刚接触JavaScript的话往往不知道这一点,所以很容易因为这一点在程序中出错。
作用域

JavaScript中作用域分为两种,分别是:

全局作用域

函数作用域

其中全局作用域指的是在一个.js文件中的作用域。全局作用域往往包含了这些特点:

变量公有化

函数公有化

简而言之就是说全局作用域中的变量和函数在这个.js都是公有的、可访问的。而函数作用域则比起它则范围相对狭小一些,特点为:

变量私有化

函数私有化

函数作用域当中的变量和函数都是私有的,任何对变量和函数的修改都只能在这个函数作用域内进行

提升 变量提升

由于我们上面所说的,JavaScript中没有块级作用域的存在,所以我们的每一个变量都是全局有效,或者是函数内有效。什么意思?我们先来看一下这段代码:

function gg(){
    if(tag !== "undefined"){
        var tag = "output!"
        console.log(tag)
    }
}
//输出: output!

上面这段代码看似不可能输出output!,但是其实这里发生了变量提升。由于块级作用域不存在,所以代码var tag = "output!"在运行时发生了如下的情况:

function gg(){
    var tag
    if(tag !== "undefined"){
        tag = "output!"
        console.log(tag)
    }
}
//输出: output!

即变量tag的定义会被提升到作用域顶部,所以tag的初值为undefined

函数提升

和变量一样,函数也存在着提升的情况,有两种声明函数的方式:

函数声明:

function gg(){
    console.log("success")
}

函数表达式:

var gg = function(){
    console.log("success")
}

其中只有函数声明能够被提升到作用域顶部,而函数表达式这种形式声明的函数则不能被提升

console.log(f1) //输出 function f1(){}
console.log(f2) //输出 undefined
function f1(){}
var f2 = function(){}
总结

JavaScript中只有两种作用域:全局作用域函数作用域。而因为这个原因,在代码中的的函数声明、变量声明都会被提升到作用域顶部

扫描下方的二维码或搜索「tony老师的前端补习班」关注我的微信公众号,那么就可以第一时间收到我的最新文章。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85015.html

相关文章

  • Js基础知识(三) - 作用域与闭包

    摘要:是词法作用域工作模式。使用可以将变量绑定在所在的任意作用域中通常是内部,也就是说为其声明的变量隐式的劫持了所在的块级作用域。 作用域与闭包 如何用js创建10个button标签,点击每个按钮时打印按钮对应的序号? 看到上述问题,如果你能看出来这个问题实质上是考对作用域的理解,那么恭喜你,这篇文章你可以不用看了,说明你对作用域已经理解的很透彻了,但是如果你看不出来这是一道考作用域的题目,...

    lemanli 评论0 收藏0
  • Js基础知识(三) - 作用域与闭包

    摘要:是词法作用域工作模式。使用可以将变量绑定在所在的任意作用域中通常是内部,也就是说为其声明的变量隐式的劫持了所在的块级作用域。 作用域与闭包 如何用js创建10个button标签,点击每个按钮时打印按钮对应的序号? 看到上述问题,如果你能看出来这个问题实质上是考对作用域的理解,那么恭喜你,这篇文章你可以不用看了,说明你对作用域已经理解的很透彻了,但是如果你看不出来这是一道考作用域的题目,...

    XFLY 评论0 收藏0
  • Js基础知识(三) - 作用域与闭包

    摘要:是词法作用域工作模式。使用可以将变量绑定在所在的任意作用域中通常是内部,也就是说为其声明的变量隐式的劫持了所在的块级作用域。 作用域与闭包 如何用js创建10个button标签,点击每个按钮时打印按钮对应的序号? 看到上述问题,如果你能看出来这个问题实质上是考对作用域的理解,那么恭喜你,这篇文章你可以不用看了,说明你对作用域已经理解的很透彻了,但是如果你看不出来这是一道考作用域的题目,...

    tanglijun 评论0 收藏0
  • Js基础知识(三) - 作用域与闭包

    摘要:是词法作用域工作模式。使用可以将变量绑定在所在的任意作用域中通常是内部,也就是说为其声明的变量隐式的劫持了所在的块级作用域。 作用域与闭包 如何用js创建10个button标签,点击每个按钮时打印按钮对应的序号? 看到上述问题,如果你能看出来这个问题实质上是考对作用域的理解,那么恭喜你,这篇文章你可以不用看了,说明你对作用域已经理解的很透彻了,但是如果你看不出来这是一道考作用域的题目,...

    lmxdawn 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<