6.web前端之路:JavaScript作用域

JavaScript

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

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

public static void main ()
{
    if(1==1){
        String name = "seven";
    }
    System.out.println(name);
}
// 报错

Java

public static void Main()
{
    if(1==1){
        string name = "seven";
    }
    Console.WriteLine(name);
}
// 报错

C#

在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。  

时间: 2024-10-13 01:16:38

6.web前端之路:JavaScript作用域的相关文章

腾讯Web前端开发框架JX(Javascript eXtension tools)

转自:Web前端开发-Web前端工程师 » 腾讯Web前端开发框架JX(Javascript eXtension tools) JX – Javascript eXtension tools 一个类似 Google Closure Library 的 Web 前端开发框架,服役于 WebQQ 等大规模的 WebApp简介JX 是模块化的非侵入式Web前端框架,最新开源地址:https://github.com/AlloyTeam/JX. JX 框架同时适用于 Web Page 和 Web App

【转】别人家的孩子之《说说我的web前端之路,分享些前端的好书》

链接http://www.cnblogs.com/Darren_code/archive/2011/02/09/JavaScript.html   2011-10-31 22:56 by 聂微东 PS:(11年现在都16年了 落后了5年哎...) WEB前端研发工程师,在国内算是一个朝阳职业,这个领域没有学校的正规教育,大多数人都是靠自己自学成才.本文主要介绍自己从事web开发以来(从大二至今)看过的书籍和自己的成长过程,目的是给想了解JavaScript或者是刚接触JavaScript的朋友,

我的web前端之路_入门篇

去年下半年我开始了我的web前端之旅,由于是工作三年后转行,为了尽快入门,我选择了参加培训班.这里我想特别说明一下,网上有很多鄙视培训的同学,但就我个人的培训经历而言,除了最后一阶段会有类似于面试忽悠,简历包装这样的辅导外,就从课程本身来说安排的还是比较合理的,授课老师知识水平和教学水平也都不错,学习氛围也比较好.除了性价比我觉得不是很高外,还有就是培训结束后自己能否保持学习.对于还在上学的同学,我是比较推荐自学.如果你对前端开发有兴趣,不妨自己学起来,现在网上的资源还是挺丰富的,如果学习中有什

为什么Web前端语言只有JavaScript?

Web前端选择语言的标准个人认为有以下几点: 一. 浏览器的支持 1.浏览器不同厂家,不同内核可以共同解析,且支持和性能选择最好的语言 2.JavaScript作为浏览器时代最早产生且经过浏览器大战及历史的沉淀中脱颖而出的语言,且成Web前端第一套标准,也是Web前端唯一一套成熟的标准. 二. 众多语言的性能及兼容方面 1.javaScript作为所有浏览器内核兼容性最好.性能最优的前提,作为Web前端支持语言中的王者也是必然. 2.javaScript本身的基于对象的特点及松散类型物特点也决定

好程序员web前端教程分享JavaScript简写方法

今天好程序员web前端教程为大家分享JavaScript简写方法,小伙伴们快来看一看吧. 1.三元操作符 当想写if...else语句时,使用三元操作符来代替. constx =20; let answer; if(x >10) { answer ='is greater'; }else{ answer ='is lesser'; } 简写: constanswer = x >10?'is greater':'is lesser'; 也可以嵌套if语句: constbig = x >10

5.web前端之路:JavaScript

JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规范编写相应代码, 浏览器可以解释并做出相应的处理. 一.如何编写 1.JavaScript代码存在形式 <!--方式一 --> <script type="text/javascript" src="JS文件"></script> <!--方式二 --> <scri

web前端之路 - 开篇

一 web发展历程 了解事物的历史有助于我们渐进式的从发展的思路清楚了解事物的来龙去脉. 这里有一篇网文写得比较清晰和完整:https://www.tianmaying.com/tutorial/web-history 二 前后端分离 前后端分离为我们说明前后端分离的依据,缘由,以及提供理论基础. 在这里也有一篇博客写得非常好,里面详细阐明了前后端分离,以及前端的一些情况和诉求,http://www.cnblogs.com/aspnethot/articles/3678994.html 三 Co

7.web前端之路:CSS剖析指之盒子模型

一.margin和padding作用域 盒子模型 二.margin margin:用于控制元素与元素之间的距离:margin的最基本用途就是控制元素周围空间的空隔 从视角上达到相互隔开的目的,俗称为外边距,其大小不会影响盒子的大小. 三.padding padding:用于控制内容与边框之间的距离,俗称为内边距,其大小会将盒子想四周撑开. 四.注意 边框在默认情况下定位于浏览器窗口的左上角,但是并没有紧贴着浏览器的宽口的边框,这是因为body 本身也是一个盒子(它存在于HTML这个大盒子里面),

6.web前端之路:DOM

DOM 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把网页和脚本以及其他编程语言联系了起来.DOM属于浏览器,而不是JavaScript语言规范里规定的核心内容. 一.查找元素 1.直接查找 var obj0 = document.getElementById('SomeId'); 根据ID获取一个标签 var obj1 = document.