JavaScript中作用域和作用域链解析

  学习js,肯定要学习作用域,js作用域和其他的主流语言的作用域还存在很大的区别。

一.js没有块级作用域。

  js没有块级作用域,就像这样:

if(){
   var a = 100;   console.log(a) //输出100
}
console.log(a) //输出100

  js中像if,for,switch之类的语句,他们包含的代码块里面的变量,在代码块外面也能被读取,所以说,js没有块级作用域。

二.js的全局变量

  js中规定,全局变量都可以看作是window的属性,而且全局变量能够被所有的代码块读取。

  

var a = 10;
function() {  b = 20;
    console.log(a); //输出10;
}console.log(b);  //输出20;

  虽然在匿名函数中对a没有定义,但是由于a是全局变量,所以其他任何的代码块都能够读取a的值。在一个复杂的项目中,全局变量如果操作不慎,很有可能带来重大的bug。所以在平时写代码的时候,应该尽量避免使用全局变量!对于一个变量来说,如果没有用var来声明的话,那么会自动认为是全局变量,因此,在书写中,一定不能漏写var。

三.js的局部变量

  js中的全局变量,很容易使代码存在问题,所以我们应该明确区分全局变量和局部变量!局部变量只在他所在的函数内部读取,在函数外部却无法读取这个变量。

  

function doSomething(){
    var blogName="智轩资本";
    function innerSay(){
        alert(blogName);
    }
    innerSay();
}
alert(blogName); //undefined
innerSay(); //undefined

四.js的作用域链问题

  由于js存在全局变量和局部变量,在调用一个变量是,会对他的作用域链进行查找,如果函数内部定义了这个变量,那么取该变量的值,如果没有,那么向上一层查找,如果找到了,就获取这个值,如果还没找到,继续往上层查找,直到找到位置,如果找到最后也没找到,那么该变量的值为undefined。

  先看一个例子:

  

  var name = ‘智轩资本‘;
function scoap() {
     console.log(name);
     var name = ‘zhixuan‘;
     console.log(name);
     console.log(age);
}

scope();

  先分析一下这个例子,scope()将调用这个函数,第一个console.log(name),会对name的值进行原型链查找,首先看函数scoap内部是否进行了定义,发现在函数内部对name进行了定义,那么第一个console.log(name)将不再往上层查找!那么第一个console.log(name)的值是不是就是“zhixuan”了呢?no!no!no!由于第一个console.log(name)时,对name还没有赋值,所以,第一个console.log(name)为undefined,第二个console.log(name)为“zhixuan”!

  再看一个例子:

  

var a = 10;
function zhixuan() {
    console.log(a);
}
function ziben() {
    var a = 20;
    zhixuan();
}
ziben();

  这次console.log(a)的值为多少呢?首先执行ziben()函数,里面定义了a为20,再执行zhixuan()函数,要求输出a的值,由于作用域在函数定义的那一瞬间就决定了,所以,zhixuan()函数会向上查找到a的全局变量,即var a=10,而不是演着ziben()里的作用域查找!所以console.log(a)为10.

  当然,我的这些理解比较浅,如果想要继续深入,推荐阅读:

  http://www.laruence.com/2009/05/28/863.html

  http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html

时间: 2024-10-11 05:37:15

JavaScript中作用域和作用域链解析的相关文章

javaScript中的this作用域

javaScript中的this作用域java的区别是,java中的this是在编译中确定, javaScript中的this是在运行时确定的,不同的调用方式,决定js中的this指向不同的对象. 代码实现: //this作用域 function sayName(){ console.log(this.name); console.log(this ===d1); console.log(this ===d2); console.log(this ===window); } sayName();

前端开发:Javascript中的数组,常用方法解析

前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.周五啦,博主的心又开始澎湃了,明儿个周末有木有,又可以愉快的玩耍了. 创建数组 创建数组的基本方式有两种,一种字面量,另一种使用构造函数创建: var arr = [1,2,3]; //字面量的形式创建数组 值与值之间用英文逗号隔开 var arr1 = new Array(1,2

【译】学习JavaScript中提升、作用域、闭包的终极指南

这似乎令人惊讶,但在我看来,理解JavaScript语言最重要和最基本的概念是理解执行上下文.通过正确学习它,你将很好地学习更多高级主题,如提升,作用域链和闭包.考虑到这一点,究竟什么是"执行上下文"?为了更好地理解它,我们首先来看看我们如何编写软件. 编写软件的一种策略是将代码分解为单独的部分.虽然这些"部分"有许多不同的名称(功能,模块,包等),但它们都是为了一个目的而存在 - 分解和管理应用程序的复杂性.现在,不要像编写代码的人那样思考,而是根据JavaScr

JavaScript中变量、作用域和内存问题(JavaScript高级程序设计第4章)

一.变量 (1)ECMAScript变量肯能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,引用类型值指那些可能由多个值构成的对象. (2)基本数据类型是按值访问,可以操作保存在变量中的实际的值:引用类型的值是保存在内存中对象,操作对象时,实际上是在操作对象的引用而不是实际的对象,引用类型的值是按引用访问的. (3)传递参数.ECMScript中所有的函数的参数都是按值传递的. function setName(obj){ obj.name = "Nichola

JavaScript 中变量、作用域和内存问题的学习

这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScript的知识,其中有些是网络上的,不过对于理解JavaScript,和在工作总是会很实用的,所以总结了下来: 那么就开始吧,首先是变量 在JavaScript中变量分为两种:一种是基本类型,基本类型值在内存中占用固定大小的空间,因此被保存在栈内存中.从一个变量向另一个变量复制基本类型的值,会创建这个值的

JavaScript中JSON的序列化与解析

前言: JSON是一种数据格式,而不是一种编程语言,很多语言都有针对JSON的序列化器和解析器. JavaScript的序列化器:JSON.stringify(). JavaScript的解析化器:JSON.parse(). //定义一个 var book = { title:"JavaScript 高级程序设计", author:[ "ncz" ], edition:3, year:2011 }; //序列化即将JavaScript对象序列化成JSON数据格式 v

javascript中JSON.parse()与eval()解析json的区别

varjsonData='{"data1":"Hello,","data2":"world!"}' 调用方法jsonData.data1,jsonData.data2 jsonData=[  {"name":"LiLei","age":19,"sex":"male"}, {"name":"HanMe

JavaScript中的作用域 、作用域链和闭包

JavaScript中作用,作用域链和闭包详解 一.作用域在js中有全局变量和局部变量之分:比如var a = 1;function sum(){var b=1console.log(b) //1console.log(a) //2 }sum()console.log(a) //3console.log(b) //4 例子中 a 是全局变量,b是局部变量(定义在函数内部,只能在函数内部访问)所以第1行正确 函数内部也能访问全局变量 a所以第2行也能正确 第三行也正确.第4行有外部不能访问内部变量

理解javascript作用域和作用域链

作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域有全局作用域和局部作用域. 全局和局部作用域下面用一张图来解释: 单纯的JavaScript作用域还是很好理解的. 作用域链 全局执行环境是最外层的一个执行环境,在web浏览器中全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和放大创建的.每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境会被推入一个函数栈中,而在函数执行完毕后执行

关于Javascript作用域及作用域链的总结

本文是根据以下文章以及<Javascript高级程序设计(第三版)>第四章相关内容总结的. 1.Javascript作用域原理,地址:http://www.laruence.com/2009/05/28/863.html 2.JavaScript 开发进阶:理解 JavaScript 作用域和作用域链,地址:http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html 在介绍有关作用域的内容之前,先来介绍