词汇范围的简要介绍是什么?


当前回答

词汇范围意味着函数在其定义的上下文中查找变量,而不是在其周围的范围中查找变量。

如果您想了解更多详细信息,请查看Lisp中词法作用域的工作原理。Kyle Cronin在Common Lisp的动态和词汇变量中选择的答案比这里的答案更清楚。

巧合的是,我只是在Lisp类中了解到这一点,而且它恰好也适用于JavaScript。

我在Chrome控制台中运行了这段代码。

// JavaScript               Equivalent Lisp
var x = 5;                //(setf x 5)
console.debug(x);         //(print x)
function print_x(){       //(defun print-x ()
    console.debug(x);     //    (print x)
}                         //)
(function(){              //(let
    var x = 10;           //    ((x 10))
    console.debug(x);     //    (print x)
    print_x();            //    (print-x)
})();                     //)

输出:

5
10
5

其他回答

让我们尝试最短的定义:

词法作用域定义了如何在嵌套函数中解析变量名:即使父函数已返回,内部函数也包含父函数的作用域。

这就是它的全部!

词法作用域意味着函数从定义它们的作用域解析自由变量,而不是从它们被调用的作用域。

IBM将其定义为:

一个程序或段单元的一部分,其中有一个声明应用。例程中声明的标识符在例程和所有嵌套例程中。如果嵌套例程声明具有相同名称的项,外部项在嵌套例程。

示例1:

function x() {
    /*
    Variable 'a' is only available to function 'x' and function 'y'.
    In other words the area defined by 'x' is the lexical scope of
    variable 'a'
    */
    var a = "I am a";

    function y() {
        console.log( a )
    }
    y();

}
// outputs 'I am a'
x();

示例2:

function x() {

    var a = "I am a";

    function y() {
         /*
         If a nested routine declares an item with the same name,
         the outer item is not available in the nested routine.
         */
        var a = 'I am inner a';
        console.log( a )
    }
    y();

}
// outputs 'I am inner a'
x();

我希望这是有帮助的,这里是我对一个稍微更抽象的定义的尝试:

词汇范围:对程序中其他元素的访问或范围(例如函数或变量),取决于其在源代码中的位置。

事实上,我的逻辑只是建立在以下定义之上:

词汇:与语言的单词或词汇有关(特别是与语法或结构分离的单词){在我们的情况下,是编程语言}。

作用域(名词):操作范围{在我们的例子中,范围是:可以访问的内容}。

注意,ALGOL 60规范中最初的1960年词汇范围定义远比我上面的尝试更为简洁:

词汇范围:源代码中应用名称与实体绑定的部分。来源

var scope = "I am global";
function whatismyscope(){
   var scope = "I am just a local";
   function func() {return scope;}
   return func;
}

whatismyscope()()

上述代码将返回“我只是本地人”。它不会返回“我是一个全球人”。因为函数func()计算最初定义的位置,该位置在函数whatismyscope的范围内。

无论调用什么(全局范围/甚至来自另一个函数),它都不会麻烦,这就是为什么全局范围值“我是全局的”不会被打印出来的原因。

这被称为词法作用域,根据JavaScript定义指南,“函数使用定义时有效的作用域链执行”。

词汇范围是一个非常强大的概念。