基础理解:3作用域作用域链

javascript的作用域和作用域链是我学习最痛苦的一部分,因为我花了好多时间看了好多技术文档都没有理解.大体知道什么意思了,然后还说不出之所以然来.

通过我大量的测试和看技术文档总结了以下理解,虽然不是很有技术范但是确实能理解了。

1、javascript只有全局和局部之分,那些后台语言的各种修饰符都没有。在函数中不使用var则为全局。如下:

<script type="text/javascript">

varname="c#";//全局

window.name="java";//全局

varlanguage=function()

{

alert(name);

name="javascript";//全局

var name="JS";//局部

alert(name);

}()

alert(name);

</script>

上面代码中表示为全局的在都指向同一个变量,下面的定义会替换上面的。关于三个alert分别是underfind,js,javascript.这就是作用域起了作用了。

2、作用域链从0级开始依次往下排,所谓的依次往下排指的是子级的排列。在寻找变量的时候先从同级找再找父级。

在上面的例子中,

首先弹出的是language方法里的第一个alert,如果window全局是0,那么在例子中var name="js"这个就是1.第一个alert就在1中找,如果找不到在去0中找。这是它发现了同级有一个var name="js"但是它目前还没有赋值,所以弹出underfind

第二个弹出是language方法里的第二个alert,同样的他会在1里找也就是方法内部。他找到了name而且赋值了js,所以弹出的是js

第三个弹出是最下面的alert,由于在方法内部已经给全局name重新赋值了,导致弹出的是javascript。

然后增加下一个链路我们在language中顶一个方法,如下:

<scripttype="text/javascript">

varname="javascript";//全局

window.name="javascript";//全局

varlanguage=function()

{

alert(name);

name="javascript";//全局

varname="JS";//局部

alert(name);

var lovelanguage=function(){

alert(name);

}();

}()

alert(name);

</script>

此时lovelanguage里的alert弹出的是js因为他会找上一级也就是language里的name,所以。。。

时间: 2024-08-10 00:04:48

基础理解:3作用域作用域链的相关文章

Javascript 进阶 作用域 作用域链

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25076713 一直觉得Js很强大,由于长期不写js代码,最近刚好温故温故. 1.Javascript没有代码块作用域的概念,局部作用域是针对函数来说的. function fun() { for( var i = 0 ; i < 10 ; i++) {} //如果在Java中i此时应当属于未声明的变量,但是Js中i的作用域依然存在 console.log(i);//10 if(

JavaScript this 局部变量全局变量 作用域 作用域链 闭包

从阮老师博客的一道测试题说起: 代码段一: var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); 代码段二: var name = "The Window"; var object

javas基础03——函数的作用域及变量提升

1.作用域 作用域,变量在函数内部作用的范围/区域.有函数的地方就有作用域. 2.局部作用域和全局作用域 function fn(){ var a = 1; } console.log(a); //报错:a is not defined 用var声明的变量,实际上是有作用域的 在函数内部定义的变量,该变量的作用域是整个函数体,在函数体外不可引用该变量,这是局部作用域 变量的生命周期: 1.永远存在----全局 程序没关,一直占用内存,少用全局 2.朝生暮死----局部 函数的大括号开头到函数的大

如何理解分布式和区块链技术

如何理解分布式和区块链技术 原文  http://www.51cion.com/article/7743.html 主题 分布式系统比特币 编译:比特人qin 简介: 区块链技术 是应用程序基础,它超越了比特币本身.这些技术能促进智能交易. 分布式 股权发布和资产转移. 彩色币 是使用 比特币区块链 技术的一个例子,另外也有其他使用其他 区块链 的例子,比如 狗狗币 和 莱特币 等.同时也介绍了开放交易的优点和缺点,另外还有一些其他的技术比如Maidsafe, Ethereum,和 Ripple

伪元素、伪类基础理解

前几天同事问我css中单冒号和双冒号是什么意思,我也模糊得很,只有个笼统的概念就是:伪元素和伪类.一直以为,页面布局中很少使用到伪类,结果细细研究发现我们经常使用的hover就是一个最简单的伪类,顿时觉得自己太OUT了,紧跟着这两天都在看这些东西,其实伪类最简单的理解就是用于向某些选择器添加特殊的效果. 具体伪类.伪元素有哪些我就不一一列举,在w3c中列举的很清楚.我主要写写应用的实例. 1.来个简单的,咱们最常用到的向超链接添加不同的颜色: <html> <head> <m

jvm基础理解

一.jvm运行时内存区域 包含堆,虚拟机栈,本地栈(调用native方法时用到),方法区(perm区),程序计数器. 假设32位操作系统,这时系统限制每个进程大小为2G.这样上述这些区域(对于本地栈及程序计数器来讲,是无法设置的,hotspot有提供-Xoss参数用于设置本地方法栈.但实际是无效的)可以用相应参数设置,共同划分全部2G内存. 注意还有一块直接内存,不属于JAVA运行时区域.但是它的空间用得太多的话,还是受限于物理内存和虚拟内存总大小,因此也会抛出OutOfMemory.典型的re

C#委托零基础理解

C#委托零基础理解(转) 1,  为什么使用委托  2.什么是委托  3.委托如何使用 为什么使用委托? 委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法.与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的. 什么是委托? 委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有相同的行为,委托方法的使用和其他方法一样,具有参数和返回值. 如何使用委托 下面咱们

一、关于作用域 作用域链的理解

作用域:每个函数有自己执行环境(个人理解即作用域),而其执行环境决定了那个环境中的变量和函数可以访问的数据的权限. 作用域链:从当前执行环境往外部检索(当前环境为此作用域链的最前端,全局环境为作用域链尾部),第一种情况检索成功,直到检索到对应变量为止:第二种情况检索失败,即找到全局环境还未找到相对应的变量,返回not defined的错误. 例:function scopetest1() { var test1 = 1;            //可访问test1 function scopet

个人理解的javascript作用域链与闭包

闭包引入的前提个人理解是为从外部读取局部变量,正常情况下,这是办不到的.简单的闭包举例如下: 1 function f1(){ 2 3 n=100; 4 5 function f2(){ 6 alert(n); 7 } 8 9 return f2; 10 11 } 12 13 var result=f1(); 14 15 result(); // 100 代码中的f2函数,就是闭包. 1 function f1(){ 2 3 var n=100; 4 5 nAdd=function(){n+=1