在Javascript中阻止范围,功能范围和本地范围

时间:2015-06-08 09:07:21

标签: javascript scope var let

  1. 块范围有时与功能范围相同吗?我知道函数范围适用于函数内部的所有内容,但不能得到块范围的确切内容。
  2. 对于Javascript,当前是否建议使用from django.shortcuts import render, get_object_or_404 from django.views import generic from bs4 import BeautifulSoup import requests from .models import Article class IndexView(generic.ListView): template_name = 'index.html' context_object_name = 'latest_article_list' def get_queryset(self): """Return the last five published articles.""" return Article.objects.order_by('-pub_date')[:5] def detail(request, article_id): article = get_object_or_404(Article, pk=article_id) html = Article.article_url read = requests.get(html) soup = BeautifulSoup(read.content) links = soup.find_all("a") return render(request, 'detail.html', {'article': article, 'links':link}) / let代替const进行维护? (这来自Airbnb Style Guide

3 个答案:

答案 0 :(得分:7)

  1. javascript 5不使用阻止范围它使用链接范围。主要区别在于除非将其设为全局变量,否则无法访问范围的变量。使用let声明变量时,ES 6将阻止作用域。
  2. 目前建议使用var,因为不完全支持ES 6。

答案 1 :(得分:3)

  

块范围有时与功能范围相同吗?我知道函数范围适用于函数内部的所有内容,但是不能得到块范围的确切内容。

块范围是的所有内容,例如:

function foo() {
    // function scope
    if (condition) {
        // block scope
    }
}

通过第5版规范,JavaScript没有块范围。下一个规范(ECMAScript 6,又名“ES6”)即将完成,通过letconst添加了块范围。

  

对于Javascript,目前是否建议使用let / const代替var以备将来维护?

这纯粹取决于你。 letconst是您可以添加到腰带的新工具。如果您不希望他们替换var,他们 来替换let。也就是说,您经常听到“var是新的let”。

使用var声明的变量具有块范围,使用let声明的变量不具有块范围。

请注意constvar don't have great support in the wild yet。毫不奇怪,将块范围添加到以前从未有过的引擎可能是非平凡的。您可以使用像Babel这样的转发器,或者暂时继续使用FlowDocument

答案 2 :(得分:2)

我不确定你是否真的已经回答了你的问题:

  

块范围有时与功能范围相同吗?我知道函数范围适用于函数内部的所有内容,但不能得到什么   完全是块范围。

,块范围有时与功能范围相同。块范围是一组括号{ a block scope here }内的所有内容。因此,在函数代码的顶部,块作用域将与函数作用域相同:

function test(x) {
   // this is both a block scope and a function scope
   let y = 5;
   if (x) {
       // this is a smaller block scope that is not the same as the function scope
       let z = 1;
   }
}
  

对于Javascript,目前建议使用let / const代替   var用于将来的维护? (这来自Airbnb风格指南)

letconst是最新ES6规范的一部分,仅在最新的Javascript引擎中实现,有时在最新的引擎中,它们仅使用特殊标志启用。他们来到所有较新的JS引擎/浏览器,但尚未广泛部署。因此,如果您正在为广泛的互联网上的常规浏览器消费编写Javascript,则无法可靠地使用letconst

在某些情况下,您现在可以安全地使用letconst进行编程:

  1. 如果您只定位特定的Javascript引擎,并且您知道它支持这些功能(例如特定版本的nodejs或仅针对特定浏览器的特定版本的插件)。< / p>

  2. 如果您使用的是将代码转换为将在所有浏览器中运行的代码的转换程序。使用转换器时,您可以使用最新功能编写代码,并且转换器将“愚弄”#34;这样,通过使用较新功能的模拟,您的代码将在旧版浏览器中运行。

  3. 如果您正在为您知道支持letconst的环境进行编程,那么建议您根据需要使用它们。如果您在函数顶部声明了一个变量,那么letvar将执行相同的操作。

    如果在函数中的较小范围内声明变量,则let将包含在较小的范围内,但var将被提升到函数的顶部并具有函数范围,无论在何处宣布。

    您链接的AirBnb Style Guide是专为ES6环境编写的(请注意,其样式指南的ES5版本有单独的链接)。所以,这意味着他们正在假设一个支持ES6的环境。这可能是因为他们的目标是服务器端的JS引擎,他们知道这些引擎支持ES6,或者因为他们使用的转换器将ES6代码转换为可在ES5引擎上运行的内容。

    关于转换器的说明。在使用转换器并将所有变量声明切换到块作用域内的let之前,有必要了解转换器生成什么类型​​的代码以及是否需要额外的代码它生成对您的应用程序的性能有任何影响。例如,通过创建内联IIFE来模拟let的块作用域,这可能导致包含let语句的每个块的额外运行时开销。我并不是说这不一定会让你无法使用转换器,但在决定是否使用转换器时,我建议你彻底熟悉转换后的代码是什么样的。各种ES6功能,让您知道它是否适合您拥有的任何工作或仅适用于某些工作。