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

原文地址:https://www.cnblogs.com/aoximin/p/12752246.html