zoukankan      html  css  js  c++  java
  • js 词法作用域

    前言

    什么是作用域?

    作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
    

    白话文:作用域就是变量在哪块地方管用。

    词法作用域

    那么什么是词法作用域呢?

    词法作用域相对动态作用域而言,也可以说其为静态作用域。

    写过后台人员,我们一直写的c#或者java 或者c++,其实都是静态作用域。

    我们手写一个c#:

    public static string goodone = "10";
    static void Main(string[] args)
    {
    	string goodone = "50";
    	testMethod();
    	Console.ReadKey();
    }
    
    public static void testMethod()
    {
    	Console.WriteLine(goodone);
    }
    

    也就是说,我们在写好函数的时候,调用上面goodone的时候,就已经知道调用到那个变量,而不会改变。

    javascript 同样也是静态作用域。

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

    上面打印出来的都是local scope,因为f函数在创建的时候就已经确定了scope调用的变量。

    JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。
    嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。
    

    动态作用域

    我们用linux的时候,编写bash脚本的时候。或者windows,shell,这些都是动态的。

    我在网上找了一个bash的例子。

    value=1
    function func() {
        echo $value;
    }
    function func2 () {
        local value=2;
        func;
    }
    func2 
    

    输出的是2,因为是动态的,$value编写的时候并没有确定是哪个变量。

    总结

    这个理解this非常重要。

  • 相关阅读:
    事务四大特征:原子性,一致性,隔离性和持久性(ACID)
    解决“要登录到这台远程计算机,你必须被授予”
    SqlServer_查看SQLServer版本信息
    sed 查找文件的某一行内容
    linux echo命令的-n、-e两个参数
    在.Net中进行跨线程的控件操作(上篇:Control.Invoke)
    .NET性能优化方面的总结
    SQLSERVER2008 显示列信息,包含扩展属性
    C#4.0新特性:可选参数,命名参数,Dynamic
    浅谈.net中的params关键字
  • 原文地址:https://www.cnblogs.com/aoximin/p/12752246.html
Copyright © 2011-2022 走看看