乐趣区

关于程序员:JavaScript作用域的定义原理及示例

为感激大家的反对,特发福利红包(支 F 宝口令红包),点击返回支付:Gitee

JavaScript 中的作用域指的是变量和函数的可拜访范畴。在 JavaScript 中,作用域有两种类型:词法作用域和动静作用域。

词法作用域
定义:词法作用域是指在代码编写的时候就确定了变量和函数的作用域。在 JavaScript 中,每个函数都会造成一个新的作用域,称为函数作用域。在函数作用域中申明的变量和函数只能在该作用域内拜访。

原理:词法作用域的原理是在函数定义的时候就确定了函数内的变量和函数的作用域。JavaScript 在查找变量时,会先在以后函数的作用域中查找,如果找不到,就会在下层作用域中持续查找,直到找到为止。

代码示例:

var a = 10;
function foo() {
  var b = 20;
  console.log(a); // 输入 10
  console.log(b); // 输入 20
}
foo();

在下面的示例中,变量 a 的作用域是全局作用域,变量 b 的作用域是函数作用域。

动静作用域
定义:动静作用域是指在函数调用的时候才确定变量和函数的作用域。在 JavaScript 中,没有动静作用域的概念,然而能够通过函数作用域和闭包来实现,也能够通过应用 eval 函数和 with 语句来实现相似于动静作用域的成果。

原理:动静作用域的原理是在函数调用时,会将以后作用域压入一个作用域栈中,而后在函数外部查找变量时,会先从栈顶查找,如果找不到,就会持续向下查找,直到找到为止。

代码示例:

function foo() {console.log(bar);
}

function baz() {
  var bar = "hello";
  foo();}

baz(); // 输入 "hello"

在这个示例中,函数 foo() 援用了变量 bar,然而它没有在 foo() 中定义。相同,变量 bar 是在调用 foo() 的函数 baz() 中定义的。在词法作用域中,foo() 应该在本人的作用域中查找变量 bar,然而在动静作用域中,它会在调用它的函数 baz() 的作用域中查找变量 bar,所以它能够拜访到 baz() 中的变量 bar。

这个示例中,foo() 是在全局作用域中定义的,然而它拜访了 baz() 中的变量 bar,这是因为 foo() 采纳了动静作用域。当 foo() 执行时,它会在调用它的函数 baz() 的作用域中查找变量 bar,而不是在本人的作用域中查找。

动静作用域的实现是通过在函数外部保留它们被调用时的作用域链。在这个示例中,当 foo() 在 baz() 中调用时,它会应用 baz() 的作用域链,其中蕴含了 baz() 中定义的变量 bar。

总结:

JavaScript 中的作用域分为词法作用域和动静作用域。词法作用域是指在代码编写的时候就确定了变量和函数的作用域,动静作用域是指在函数调用的时候才确定变量和函数的作用域。在 JavaScript 中,只有词法作用域,然而能够通过应用 eval 函数和 with 语句来实现相似于动静作用域的成果。倡议在编写 JavaScript 代码时,尽量避免应用 eval 函数和 with 语句。

为不便宽广前端技术爱好者,整合了前端技术相干常识和资源,且有很多福利能够支付:Gitee

如有转载需要,请分割:Gitee

本文由 mdnice 多平台公布

退出移动版