• What is the scope of variables in JavaScript? 还没看完


    What is the scope of variables in JavaScript?

    What is the scope of variables in javascript? Do they have the same scope inside as opposed to outside a function? Or does it even matter? Also, where are the variables stored if they are defined globally?

    回答1

    TLDR  太长不看版

    JavaScript has lexical (also called static) scoping and closures. This means you can tell the scope of an identifier by looking at the source code.

    The four scopes are:

    1. Global - visible by everything
    2. Function - visible within a function (and its sub-functions and blocks)
    3. Block - visible within a block (and its sub-blocks)
    4. Module - visible within a module

    Outside of the special cases of global and module scope, variables are declared using var (function scope), let (block scope), and const (block scope). Most other forms of identifier declaration have block scope in strict mode.

    Overview

    Scope is the region of the codebase over which an identifier is valid.

    A lexical environment is a mapping between identifier names and the values associated with them.

    Scope is formed of a linked nesting of lexical environments, with each level in the nesting corresponding to a lexical environment of an ancestor execution context.

    These linked lexical environments form a scope "chain". Identifier resolution is the process of searching along this chain for a matching identifier.

    Identifier resolution only occurs in one direction: outwards. In this way, outer lexical environments cannot "see" into inner lexical environments.

    There are three pertinent相关的 factors in deciding the scope of an identifier in JavaScript:

    1. How an identifier was declared
    2. Where an identifier was declared
    3. Whether you are in strict mode or non-strict mode

    Some of the ways identifiers can be declared:   变量如何被声明的

    1. varlet and const
    2. Function parameters
    3. Catch block parameter
    4. Function declarations
    5. Named function expressions
    6. Implicitly defined properties on the global object (i.e., missing out var in non-strict mode)
    7. import statements
    8. eval

    Some of the locations identifiers can be declared:   变量在什么位置被声明的

    1. Global context
    2. Function body
    3. Ordinary block
    4. The top of a control structure (e.g., loop, if, while, etc.)
    5. Control structure body
    6. Modules

    Declaration Styles

    var

    Identifiers declared using var have function scope, apart from when they are declared directly in the global context, in which case they are added as properties on the global object and have global scope. There are separate rules for their use in eval functions.

    var声明的变量,有function scope(除了那些全局定义的)

    let and const

    Identifiers declared using let and const have block scope, apart from when they are declared directly in the global context, in which case they have global scope.

    Note: letconst and var are all hoisted. This means that their logical position of definition is the top of their enclosing scope (block or function). However, variables declared using let and const cannot be read or assigned to until control has passed the point of declaration in the source code. The interim临时的 period is known as the temporal dead zone.

    function f() {
        function g() {
            console.log(x)
        }
        let x = 1
        g()
    }
    f() // 1 because x is hoisted even though declared with `let`!
  • 相关阅读:
    数组常用函数
    数组游标操作
    PHP中 字符串 常用函数
    mysqli扩展库的预处理技术 mysqli stmt
    mysql的事务处理
    mysqli的增强功能
    mysql扩展库-1
    抽象类与接口
    iOS判断字符串是否包含表情字符
    iOS8 UITableView 分割条设置separator intent = 0 不起作用
  • 原文地址:https://www.cnblogs.com/chucklu/p/14317762.html
Copyright © 2020-2023  润新知