首页 > 其他分享 >js没有块级作用域

js没有块级作用域

时间:2022-11-28 10:55:48浏览次数:38  
标签:块级 变量 作用域 JavaScript 代码段 js var scope

JavaScript没有块级作用域。在其他语言上,比如C语言中,有花括号封闭的代码块都有自己的作用域,(如果用ECMAScript的话来讲,就是他们自己的执行环境),因而支持根据条件来定义变量。例如,下面的代码效果

if (true) {

var color  = "blue";

}

alert(color);//blue

这里是一个if语句中定义了一个变量color,如果是在C,C++或者Java中,color会在if执行后被销毁。但是在JavaScript中,if语句中的变量声明会将变量添加到当前的执行环境(这里是全局环境)中。在使用for语句时尤其要牢记这个差异。例如

for (var i =0; i < 10; i++) {

doSomething(i);

}

alert(i); // 10

对于有块级作用域的语言来说,for语句初始化变量的表达式所定义的变量,只会存在于循环的环境中。而对于JavaScript来说,for语句创建的变量i即使在for循环执行结束之后,依旧存在于循环外部的执行环境之中。 

1.声明变量

    使用var声明变量会自动被添加到最近的环境之中。在函数内部,最接近的环境就是函数的局部环境;如果没有使用var,则变量会被自动添加到全局环境中。

每一步都是一个深刻的脚印   代码段1:
var scope="global";  
function f(){   
    console.log(scope);  
    var  scope="local"  
    console.log(scope);  
}  
f();

会输出什么?

  答案:undefined  local

  

  代码段2:

1 var scope="global";  
2 function f(){  
3     var scope;  
4     console.log(scope);  
5     scope="local"  
6     console.log(scope);  
7 }  
8 f();

 又会输出什么?

  答案:undefined  local

 

  代码段3:

1 var scope="global";  
2 function f(){  
3     console.log(scope);  
4 }  
5 f();

又会输出什么?

  答案:global

  通过以上三个例子,下面解释“JavaScript没有块级作用域,有函数作用域”这句话。

  在JavaScript中,由于函数作用域的特性,代码段1和代码段2是等价的,局部变量在整个函数体是中是有定义的,

也就是说,代码段1在函数体内的局部变量scope覆盖了同名全局变量,并且只有在程序执行到var 语句的时候,局部变量scope才会被真正的

赋值。因此,上述过程等价于:将函数内的变量声明“提前”至函数体顶部,同时变量初始化留在原来的位置:也就是代码段2。

  在具有块级作用域的编程语言中,在狭小的作用域里让变量声明和使用变量的代码尽可能靠近彼此,通常来讲,这是一个非常不错的编程

习惯。由于JavaScript没有块级作用域,因此,一些程序员特意将变量声明放在函数体顶部,而不是将声明靠近放在使用变量之处。这种做法

使得他们的源代码非常清晰地放映了知识的变量作用域。

标签:块级,变量,作用域,JavaScript,代码段,js,var,scope
From: https://www.cnblogs.com/net-sky/p/16931601.html

相关文章

  • 深入浅出的介绍下作用域和闭包
    深入浅出的介绍下作用域和闭包闭包对前端的同学,经常被问道的一个问题就是,什么是闭包。是不是很熟悉???闭包是一个有权访问另外一个函数作用域中的变量的函数关键的两点......
  • 作用域和闭包常见的面试题
    作用域和闭包常见的面试题作用域变量提升varscope="global";functionscopeTest(){console.log(scope);varscope="local"}scopeTest();//undefined......
  • 本地JS文件批量压缩
    最近在维护一个小后台项目,有段JS需要压缩上传到CDN存储服务器。由于之前压缩的JS文件都比较少,都是手动压缩的。这次需要压缩的文件比较多,所以用了批量压缩。特此记录一下......
  • Microsoft & Node.js All In One
    Microsoft&Node.jsAllInOneNode.jsreadnestedfolderspathconstfs=require("fs").promises;constpath=require("path");constitems=awaitfs.readd......
  • ApiJSON简单使用示例
    1{2"[]":{3"query":2,4"User":{5"@column":"id,name"6},7"count":5,8"@order":......
  • JS的深浅拷贝
    基本数据类型:number、string、boolean、null、undefined引用数据类型:object、function、array存储位置的不同基本数据类型:将值存储在栈中,栈中存放的是对应的值......
  • js原型和原型链
    目录原型和原型链原型原型链原型和原型链原型在理解之前,明白一个前提,js也是有类的,也可以定义方法和构造函数隐式原型:对象的_proto_属性(里面有类定义的方法,且这个属性每......
  • jquery009-js执行的先后顺序
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><bodystyle="width:980px;margin:0auto"><h1>#一,当页面框架......
  • leetcode 56. 合并区间 js实现
    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i]=[starti,endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入......
  • vs2008 调试js
    面对一大段的JavaScript脚本,以前总是会很头疼,找不到调试这些代码的方法。如果出现什么错误或异常,总是要从头分析,然后插入很多Alert(),调试起来很麻烦。VisualStudio2008中J......