JavaScript上下文视图

你好! 我们已经在9月底的OTUS中写道, “ Fullstack JavaScript Developer”课程的新流将开始。 预期将开始上课,我们将继续与您分享专门为该课程的学生准备的版权文章。 今天,我们将介绍JavaScript中的上下文类型。 走吧

文章作者: Pavel Yakupov




本文的目的是使读者了解JavaScript中使用的范围的基本概念。

范围是JavaScript中最重要的内容之一(它在大多数现代编程语言中都占有一席之地)。 范围与变量或函数的长寿命,访问权限,变量的可见性以及其他一些东西相关。

为什么我们需要这个范围?


编程语言的作用域执行以下功能:
安全性(封装)-变量和函数仅在需要时才可用。
消除了变量名的冲突。 作用域的存在使您不必将所有变量“转储”到一个堆中,从而模拟名称空间(名称空间)。
重用代码-可以使用编写的代码,避免了“繁琐”的影响。

范围类型


在最简单的级别上,在JavaScript中有两个作用域-本地和全局。

在本文中,我们还将涉及词汇和块等范围。

全球范围


当您使用JavaScript打开文档并开始编写代码时,就会陷入全局范围。

全局范围内创建的所有内容(变量,函数)均可从程序中的任何位置进行访问。 同样,全局变量在您的应用程序运行期间始终可用,并且仅在程序完成工作时才删除。

刚开始时,许多新手经常使用全局变量-这在某种程度上更易于编程,但这被认为是不好的做法,并且常常导致不稳定的程序,最终使用的内存远远超出其实际需要。 毕竟,如果将变量可靠地封装在使用它们的函数内部,则在函数结束时,将使用垃圾回收器将它们从内存中删除,并停止占用客户端内存,内存不是无限的。

当地范围


在本地声明的变量仅在声明它们的范围内可用。

创建新作用域的最简单方法是创建新功能。 在函数内部创建的变量只能从内部访问。 另外,可以使用块作用域来获得局部作用域(将在下面讨论)。

function foo(){ let x = 15; } //console.log(x); error { let y = 14; } // console.log(y);  error { var z = 13; } console.log(z); // var   , //        // -  13 

词汇范围


那么词汇范围是什么? 简单来说,这是内部功能访问外部范围的能力。 这里值得转向闭包的实践。 您可能还可以再写几篇关于它们的文章,但我将快速举一个经典的例子:

 sum(5)(5) //    ? function sum(a){ var add = function(b){ return a+b; } return add; } console.log(sum(5)(5)); // 10   //      

块范围


到目前为止,我们仅讨论了与函数和花括号{}的操作相关的范围,并且我们讨论了var和间接操作的区别。

var指令如何工作? 当在全局范围内使用变量声明变量时,变量名称将作为属性分配给全局窗口对象(如果我们指的是浏览器),并且在程序运行期间一直保持不变。 同时,作为块作用域,例如{}(并且在逻辑上包含if,for,while和所有其他)。

此外,let和const还有另一个功能-在一个作用域中声明,因此不能在同一作用域中再次声明(嗯,解释器的不满意在这里看起来很合逻辑)。

 let x = 15; console.log(x); //   { let x = 16; //       console.log(x) //          let x = 17; //        ,         } 

新功能


在将新功能声明为“新功能”时,作用域的功能。 创建函数的此选项很少使用,但有时可能是必需的。
语法示例:

 //let newFunc = new Function([arg1, arg2…argN], functionBody); let mult = new Function('a', 'b', 'return a * b'); console.log(mult(3,4)); 

通常,函数会记住它的出生位置(词法环境),但是当使用新的Function构造创建函数时,它不会像通常情况那样写围绕它的环境变量,而只会写全局声明的那些变量。

 //   ,      ()()     let a = 3; function outerFunc() { var a = 2; var func = new Function('console.log(a*a)'); return func; } outerFunc()(); // 9,    window 

吊装(提升变量)


在讨论范围时,我们不能涉及提高变量范围的话题。 读取代码的解释器实际上读取了两次:它读取声明为函数声明的函数,并读取使用var变量声明为global的全局变量。 但是,变量不是通过声明的值记录的,而是通过未定义的值记录的。

 console.log(x); // undefined var x = 15; console.log(y);// error let y = 13; 

让本主题仅间接涉及可见性领域,但有时这些知识会派上用场。

谢谢大家! 我希望本文对某人有用!



有用的链接:

developer.mozilla.org/zh-CN/docs/Glossary/Scope
developer.mozilla.org/en/docs/Web/JavaScript/Closures
2ality.com/2015/02/es6-scoping.html
Learn.javascript.ru/new-function
habr.com/zh/company/otus/blog/466873

Source: https://habr.com/ru/post/zh-CN467631/


All Articles