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非常重要。

  • 相关阅读:
    Java静态分派与动态分派(二)
    重载和重写在jvm运行中的区别(一)
    startActivity启动过程分析(转)
    进程篇—进程整理(转)
    理解Android线程创建流程(转)
    Android进程绝杀技--forceStop(转)
    说说Android应用的persistent属性(转)
    Android四大组件与进程启动的关系(转)
    转: 安卓自动缩放布局,解决屏幕适配问题
    转: android apk 防止反编译技术(1~5连载)
  • 原文地址:https://www.cnblogs.com/aoximin/p/12752246.html
Copyright © 2011-2022 走看看