javascript-词法作用域规则-作用域链-闭包运用学习心得

虽然在平时貌似,很习以为常的一些用法但是真要弄清这几个概念的时候,确实费了很大功夫,现在虽然不能说明白但总算有了一些心得。好吧下面直接开始

注本文(*)为相关链接

例子1.1

词法作用域规则:函数的嵌套关系是定义时决定的,而非调用时决定的,即词法作用域,即嵌套关系是由词法分析时确定的,而运行时决定。

(*)http://blog.csdn.net/zzulp/article/details/8144520

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

(*)http://www.jb51.net/article/24101.htm

 1 var oa=3;
 2
 3 function a()
 4 {
 5     var oa = 2;
 6     return b();
 7     function b()
 8     {
 9         return function()
10         {
11             return oa;
12         };
13     }
14 }
15 alert(a()());//=>2

因为 11行 return oa 在定义时候是在a()函数的作用域内,并且在执行到 这里的时候 oa 会在 作用域链 产生的 活动对象 寻找 如果没有找到 就会往下 寻找一直找到 全局变量,但是这里a()函数有重新定义oa 所以

优先找到了 <2>.

1.2

 1 var oa=3;
 2
 3 function a()
 4 {
 5     var oa = 2;
 6     return b();
 7     function b()
 8     {
 9         return function()
10         {
11             return this.oa;
12         };
13     }
14 }
15 alert(a()());//=>3

这里的this.oa 被返回出去 (个人见解:this.oa 被认为是某一个对象下的属性,在作用域链中只有当搜索到 全局对象的时候 oa 是window下的一个属性 所以成立)

1.3

 1 var oa=3;
 2
 3 function a()
 4 {
 5     var oa = 2;
 6     return b();
 7     function b()
 8     {
 9         return oa;
10     }
11 }
12 alert(a());//=>2

1.4

 1 var oa=3;
 2
 3 function a()
 4 {
 5     var oa = 2;
 6     return b();
 7     function b()
 8     {
 9         return this.oa;
10     }
11 }
12 alert(a());//=>3

例子2.1

(*)http://www.w3school.com.cn/js/pro_js_object_scope.asp

(*)http://blog.cnbang.net/tech/2025/

 1  var oa=3;
 2  var a = {
 3      oa : 2,
 4      b : function()
 5      {
 6         return function()
 7          {
 8          return oa;
 9          };
10      }
11  };
12 alert(a.b()());//=>3

这里的oa(个人理解是 :首先这个oa不是a的属性, 且oa没有声明 var 所以直接返回的 就是全局变量,为了证明这一点 我在这个函数内部 声明了 var oa;尝试 结构返回 undefined)

2.2

 1  var oa=3;
 2  var a = {
 3      oa : 2,
 4      b : function()
 5      {
 6         return function()
 7          {
 8          return this.oa;
 9          };
10      }
11  };
12 alert(a.b()());//=>3

(个人理解是 :因为当 return this.oa 的时候 this指向了 window,我尝试在 这个方法和这个方法的外层添加 a.oa=10;但是 依然返回3,貌似这里并没有产生作用域的关系,但是

再次做尝试 将11行改为 return a.oa =>2;说明这里有作用链的关系 只是 当this返回出去的时候 应该是产生了新的作用域链 所以this的指向发生了变化 指向了window)

2.3

1  var oa=3;
2  var a = {
3      oa : 2,
4      b : function()
5      {
6          return this.oa;
7      }
8  };
9 alert(a.b());//=>2

在这个例子里面 返回了a的b方法 所以this指向了 a

2.4

1  var oa=3;
2  var a = {
3      oa : 2,
4      b : function()
5      {
6          return oa;
7      }
8  };
9 alert(a.b());//=>3

直接返回全局变量

时间: 2024-10-09 19:22:38

javascript-词法作用域规则-作用域链-闭包运用学习心得的相关文章

lua语言中闭包的学习心得

lua语言有如下两个特点: 1.lua中的函数可以被存放在变量.表中,也可以作为函数的参数,还可以作为函数的返回值,如: func = function() print("Hello"); end 等价于 function func() print("Hello"); end 这两种写法都是函数func()的定义:并且下面这个例子: function func() return function() print("Hello"); end --函

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

Javascript的作用域、作用域链以及闭包

一.javascript中的作用域 ①全局变量-函数体外部进行声明 ②局部变量-函数体内部进行声明 1)函数级作用域 javascript语言中局部变量不同于C#.Java等高级语言,在这些高级语言内部,采用的块级作用域中会声明新的变量,这些变量不会影响到外部作用域. 而javascript则采用的是函数级作用域,也就是说js创建作用域的单位是函数. 例如: 在C#当中我们写如下代码: static void Main(string[] args) { for (var x = 1; x < 1

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 初学者来说,最难的不是代码部分,而是对很多书籍中的术语的理解,大多时候想要理解一段JavaScript书籍中的解释内容,就会涉及很多术语,在术语不通的情况下都会对内容理解偏差(导致很难记住所学内容),由于本人在阅读书籍时经常会遇到这一问题,所以今天将记下这一基础内容. 一.需要关注点 1)执行环境(作用域)函数执行环境 变量作用域 2)函数作用域和声明提前 3)自由变量 4)词法作用域和静态

闭包、作用域、作用域链

一 作用域,作用域链 先上代码 1 var scope="global"; 2 function t(){ 3 console.log(scope); 4 var scope="local" 5 console.log(scope); 6 } 7 t(); 此时打印出来的 按顺序分别是undefine,local,为什么第一个是undefined呢,摘抄下js作用域原话: Javascript没有块级作用域,而是函数作用域. 所谓函数作用域就是说:->变量在声

JavaScript词法作用域与调用对象

关于 Javascript 的函数作用域.调用对象和闭包之间的关系很微妙,关于它们的文章已经有很多,但不知道为什么很多新手都难以理解.我就尝试用比较通俗的语言来表达我自己的理解吧. 作用域 Scope Javascript 中的函数属于词法作用域,也就是说函数在它被定义时的作用域中运行而不是在被执行时的作用域内运行.这是犀牛书上的说法.但"定义时"和"执行(被调用)时"这两个东西有些人搞不清楚.简单来说,一个函数A在"定义时"就是 functio

javascript学习中自己对作用域和作用域链理解

在javascript学习中作用域和作用域链还是相对难理解些,下面我关于javascript作用域和作用域链做一下详细介绍,给各位初学者答疑解惑. 首先我们介绍一下什么是作用域?  从字面上理解就是起作用的区域.   作用域主要有两种作用域:      1.块级作用域(js 不支持):主要用于C系列语言中,例如:Java Object-c/Swift(苹果开发语言).C++/C#.在此不做过多说明.      2.词法作用域  一个变量的作用范围,在代码写出来的那一刻就定下来了,不会根据代码的运

JavaScript之作用域与作用域链

今天是2016的第一天,我们得扬帆起航踏上新的征程了.此篇阐述JavaScript中很重要的几个概念:作用域与作用域链及相关知识点. 我们先从变量与作用域的行为关系开始讨论. 变量作用域 JavaScript中,变量有全局变量及局部变量之分,而能定义变量作用域的语块只有函数.与局部变量有关的一种有趣特性,在此处不得不谈--变量提升. 变量提升 变量提升为何物? JavaScript的变量声明会被提升到它们所在函数的顶部,而初始化仍旧在原来的地方.JavaScript引擎并没有重写代码:每次调用函