zoukankan      html  css  js  c++  java
  • 5 作用域

    1 变量的作用域

    通俗的理解,可以理解为变量的有效领域,有点类似C++,java中的局部变量和全局变量的概念。

    var scope = "global";
    function checkscope(){
        var scope = "local";
        return scope;
    }
    checkscope();

    上述程序中,首先定义了一个全局变量scope,该变量在整个全局中都是有效的,在函数checkscope内部也能访问,同时,函数checkscope内部也定义了一个变量scope,该变量的作用域只存在于函数checkscope中,只能在函数checkscope中进行访问。如果函数checkscope中没有定义scope局部变量,那么返回的scope的值是global,但局部变量优先级是大于全局变量的,所以返回的值是local。

    2 函数作用域

    首先,我们看一个简单的例子:

    var scope = "global";
    function f(){
        console.log(scope);
        var scope = "local";
        console.log(scope);
    }

    结果是undefined,local,为什么呢? js的函数作用域是指在函数中声明的所有变量在函数体中始终是可见的,更有意思的是,变量在声明之前就可以使用。

    这个特性被称为声明提前(hosting)。所以,程序执行到第一个console.log(scope)时,局部变量scope已经被定义了,但是没有赋值,所以是undefined。

    再接下来,看一个复杂一点的例子:

    var o = "a";
    function test(o){
        var i = 0;
        if(typeof o == "object"){
            var j = 1;
            for(var k = 0; k < 10; k++){
                console.log(k);
            }
            console.log(k);
        }
        console.log(j);
    }
    test(o);

    结果是undefined。

    在上述代码中,变量i,j,k都在同一作用域中,这三个变量在函数体中都是有定义的。

    3 块级作用域

    for(var i = 0; i < 10; i++){
        doSomething(i);
    }
    alert(i);

    如果在java中,for运行完后,会摧毁i,但JavaScript不会,如果想for运行完后,摧毁i,可以用es6语法中的let,如下:

    for(let i = 0; i < 10; i++){
        doSomething(i);
    }
    alert(i);

    此时,在for循环外访问i,会报错。

  • 相关阅读:
    emulate sh
    postmaster.c 中的 ListenAddresses
    PostgreSQL的postmaster的fork动作验证
    NotifyMyFrontEnd 函数背后的数据缓冲区(三)
    对${ZSH_VERSION+set}的验证
    微软正准备一个简易的Rootkit清除方案 助用户打补丁 狼人:
    创新与安全:云计算的两只跷跷板 狼人:
    苹果禁止iPhone黑客访问App Store应用商店 狼人:
    春节不回家 单身留守族“拼饭”“拼玩” 狼人:
    僵尸侵入全球 袭击者或为东欧黑帮 狼人:
  • 原文地址:https://www.cnblogs.com/lijy/p/6610888.html
Copyright © 2011-2022 走看看