JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕。

 

一、“JavaScript中无块级作用域”

在Java或C#中存在块级作用域,即:大括号也是一个作用域。

public static void main (){

   if(1==1){

       String name = "seven";

   }

   System.out.println(name);

}

// 报错

public static void Main()

{

   if(1==1){

       string name = "seven";

   }

   Console.WriteLine(name);

}

// 报错

在JavaScript语言中无块级作用域

function Main(){

   if(1==1){

       var name = 'seven';

   }

   console.log(name);

}

// 输出: seven

补充:标题之所以添加双引号是因为JavaScript6中新引入了 let 关键字,用于指定变量属于块级作用域。

二、JavaScript采用函数作用域

在JavaScript中每个函数作为一个作用域,在外部无法访问内部作用域中的变量。

function Main(){

   var innerValue = 'seven';

}

 

Main();

 

console.log(innerValue);

 

// 报错:Uncaught ReferenceError: innerValue is not defined

三、JavaScript的作用域链

由于JavaScript中的每个函数作为一个作用域,如果出现函数嵌套函数,则就会出现作用域链。

xo = 'alex';

 

function Func(){

   var xo = "seven";

   function inner(){

       var xo = 'alvin';

       console.log(xo);

   }

   inner();

}

Func();

如上述代码则出现三个作用域组成的作用域链,如果出现作用域链后,那么寻找变量时候就会出现顺序,对于上述实例:

当执行console.log(xo)时,其寻找顺序为根据作用域链从内到外的优先级寻找,如果内层没有就逐步向上找,直到没找到抛出异常。

四、JavaScript的作用域链执行前已创建

JavaScript的作用域在被执行之前已经创建,日后再去执行时只需要按照作用域链去寻找即可。

示例一:

xo = 'alex';

 

function Func(){

   var xo = "seven";

   function inner(){

 

       console.log(xo);

   }

   return inner;

}

 

var ret = Func();

ret();

// 输出结果: seven

上述代码,在函数被调用之前作用域链已经存在:

全局作用域 -> Func函数作用域 -> inner函数作用域

当执行【ret();】时,由于其代指的是inner函数,此函数的作用域链在执行之前已经被定义为:全局作用域 -> Func函数作用域 -> inner函数作用域,所以,在执行【ret();】时,会根据已经存在的作用域链去寻找变量。

示例二:

xo = 'alex';

 

function Func(){

   var xo = "eirc";

   function inner(){

 

       console.log(xo);

   }

   xo = 'seven';

   return inner;

}

 

var ret = Func();

ret();

// 输出结果: seven

上述代码和示例一的目的相同,也是强调在函数被调用之前作用域链已经存在:

全局作用域 -> Func函数作用域 -> inner函数作用域

不同的时,在执行【var ret = Func();】时,Func作用域中的xo变量的值已经由 “eric” 被重置为 “seven”,所以之后再执行【ret();】时,就只能找到“seven”。

示例三:

xo = 'alex';<br>

function Bar(){

   console.log(xo);

}

 

function Func(){

   var xo = "seven";

 

   return Bar;

}

 

var ret = Func();

ret();

// 输出结果: alex

上述代码,在函数被执行之前已经创建了两条作用域链:

全局作用域 -> Bar函数作用域 
全局作用域 -> Func函数作用域

当执行【ret();】时,ret代指的Bar函数,而Bar函数的作用域链已经存在:全局作用域 -> Bar函数作用域,所以,执行时会根据已经存在的作用域链去寻找。

五、声明提前

在JavaScript中如果不创建变量,直接去使用,则报错:

console.log(xxoo);

// 报错:Uncaught ReferenceError: xxoo is not defined

JavaScript中如果创建值而不赋值,则该值为 undefined,如:

var xxoo;

console.log(xxoo);

// 输出:undefined

在函数内如果这么写:

function Foo(){

   console.log(xo);

   var xo = 'seven';

}

 

Foo();

// 输出:undefined

上述代码,不报错而是输出 undefined,其原因是:JavaScript的函数在被执行之前,会将其中的变量全部声明,而不赋值。所以,相当于上述实例中,函数在“预编译”时,已经执行了var xo;所以上述代码中输出的是undefined。

转载于:https://www.cnblogs.com/zrbfree/p/5659837.html

160630、五句话搞定JavaScript作用域相关推荐

  1. 五句话搞定JavaScript作用域【转】

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一."JavaScript中无块级作用域" ...

  2. 来来来,一起五句话搞定JavaScript作用域

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一."JavaScript中无块级作用域" ...

  3. 5句话搞定ES5作用域

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一."JavaScript中无块级作用域" ...

  4. 我和小美的撸码日记(3)之中的一个句话搞定MVC表单页数据绑定与提交

    另外献上在<线体验Demo地址>希望大家也能从中得到一些启示. 地址:http://121.40.148.178:8080/ . username:guest,password:12345 ...

  5. Android:用GSON 五招之内搞定任何JSON数组

    写在前面原文  http://www.iamxiarui.com/2016/08/30/android:用gson-五招之内搞定任何json数组/ 关于GSON的入门级使用,这里就不提了,如有需要可以 ...

  6. 五个小例子教你搞懂 JavaScript 作用域问题

    原文:五个小例子教你搞懂 JavaScript 作用域问题 众所周知,JavaScript 的作用域和其他传统语言(类C)差别比较大,掌握并熟练运用JavaScript 的作用域知识,不仅有利于我们阅 ...

  7. 轻松搞定javascript变量(闭包,预解析机制,变量在内存的分配 )

    变量:  存储数据的容器 1.声明        var 2.作用域全局变量. 局部变量. 闭包(相对的全局变量): 3.类型a.基本类型(undefined, null, boolean, numb ...

  8. 九十五、轻松搞定Python中的Excel办公自动化系列

    @Author:Runsen @Date:2020/7/11 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  9. 命令启动jar包_java项目打jar包,一句命令搞定

    jar命令格式:jar {c t x u f }[ v m e 0 M i ][-C 目录]文件名 其中{ctxu}这四个参数必须选选其一. [v f m e 0 M i ]是可选参数,文件名也是必须 ...

最新文章

  1. python不小心用关键字做了变量名,怎么改回来
  2. 深度学习项目-神经元结构可视化
  3. WPF 实现验证码控件
  4. 几天没写代码,就……
  5. CSS尺寸和字体单位-em、px还是%
  6. android样式文件,Android学习笔记样式资源文件
  7. 718. 最长重复子数组(JavaScript)
  8. 千方科技的中场战事:选择、进化与野望
  9. 关于SuperMap的ISManager访问权限问题
  10. 全网首发:跟踪分析This parser does not support specification “null“ version “null“
  11. 洛谷 [P1890] gcd区间
  12. 微弱信号检测_光电探测与信号处理教学大纲
  13. 从单机数据库到分布式数据库,从数据库事务到分布式事务
  14. 视频接口的种类及数据类型
  15. Unity-WebGL遇到的各种坑(一)
  16. TCP 三次握手 四次挥手 tcpdump Flags
  17. [WinError 6] 句柄无效。
  18. 【在线电子书转换】云展网教程 | 如何设置电子书的翻页速度?
  19. 计算机系统关键服务有多少项,你好,QQ电脑管家启动项说系统关键项启动100多秒。怎么回事?...
  20. Python Pyinstaller安装与使用

热门文章

  1. 2022-2028年中国铅锌精矿粉行业市场研究及前瞻分析报告
  2. keyshot怎么批量渲染_提高Keyshot逼真渲染的小技巧
  3. C++ 笔记(33)— C/C++ 程序员常见面试试题深入剖析
  4. lightgbm保存模型参数
  5. oracle sqlserver 查看指定用户下面的表
  6. kafka+zookeeper搭建步骤kafka问题
  7. pytorch nn.Embedding
  8. 3D惯导Lidar仿真
  9. 操作系统常用词典(二)
  10. 自动驾驶系统关系与自动泊车原理