前言
什么是作用域?
作用域(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非常重要。