原文链接:                 http://www.nowamagic.net/librarys/veda/detail/1305 作用域(scope) JavaScript 中的函数属于词法作用域,也就是说函数在它被“定义时”的作用域中运行,而不是在“被执行时”的作用域内运行. 什么是“定义时”? 什么是 “被执行时”? 定义时: 一个函数A在“定义时”就是 function A() { }这个语句执行的时候,就是定义这个函数的时候. 被执行时: A“被执行时”(被调用的时侯)…
function foo() {console.log( a ); // 2不是3} function bar() {var a = 3;foo();} var a = 2;bar(); js中的作用域就是词法作用域 词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规则. 词法作用域最重要的特征是它的定义过程发生在代码的书写阶段( 假设你没有使用eval() 或 with) 而动态作用域并不关心函数和作用域是如何声明以及在何处声明的, 只关心它们从何处调用. 换句话说, 作用域链是基于…
作用域链和原型链是JS中比较重要的2个概念, JS的是函数作用域,与C之类语言的块级作用域不同 JS的作用域还是词法作用域,或者叫静态作用域,作用域链是在语法解析时就完成的,而不是在执行时创建. 例子 var scope = 'global';function fn1(){ console.log(scope); }function fn2(){ var scope = 'local'; fn1(); }fn1(); //globalfn2(); //global…
关于js 还是写的简短些,利于个人理解: 先看一个例子: var a = 2; function fn(){ var a = 3; console.log(a); } fn(a); 说明:作用域查找会在找到第一个匹配的标识符时停止,也叫做“”遮蔽效应“” 这里很好理解,我们平时用的也很多.还有就是作用域查找只会查看一级标识符,比如foo.bar,只会查找foo,这个也很好理解. 欺骗词法: 也就是动态修改词法作用域.(不推荐,会导致性能下降) 1.eval() 可以接受字符串为参数,将内容看做是…
终于到了神话破灭的时刻-- 这注定是一篇"自取其辱"的博客,飞哥,你们眼中的大神,Duang,这次脸朝下摔地上了. 故事得从这个求助开始:e.returnValue 报错:未定义,"一起帮"现在人气还不够旺,碰到了我勉勉强强能够解决的问题,硬着头皮也得上啊!远程一看,问题不是e.returnValue没值,是e本身就没值.而更核心的问题是:这段代码,是被放在setTimeout()里面的.(这里插一句:很多问题,就得远程,求助人贴出来的代码,根本就没抓住重点.话说,…
一.函数作用域 1.函数作用域 就是作用域在一个“Function”里,属于这个函数的全部变量都可以在整个函数的范围内使用及复用. function foo(a) { var b = 2; function bar() { // ... } var c = 3; } bar(); // 失败 console.log( a, b, c ); // 三个全都失败 上面的“foo”函数内的几个标识符,放到函数外面访问就都会报错.…
关于 Javascript 的函数作用域.调用对象和闭包之间的关系很微妙,关于它们的文章已经有很多,但不知道为什么很多新手都难以理解.我就尝试用比较通俗的语言来表达我自己的理解吧. 作用域 Scope Javascript 中的函数属于词法作用域,也就是说函数在它被定义时的作用域中运行而不是在被执行时的作用域内运行.这是犀牛书上的说法.但"定义时"和"执行(被调用)时"这两个东西有些人搞不清楚.简单来说,一个函数A在"定义时"就是 functio…
在前一篇文章中,我们把作用域定义为"管理.维护变量的一套规则",接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是动态作用域, Javascript采用的是词法作用域, 关于动态作用域的有兴趣的可以自行Google. 1.词法阶段 首先我们要理解"词法阶段"这个词语,我们已经了解到Js存在一个编译阶段,编译阶段的第一步就是分词/词法分析,我们可以简称为"词法阶段" 简单来说,词法作…
原文:你不知道的js系列 词法作用域(Lexical Scope) Lex time 一个标准的编译器的第一个阶段就是分词(token化) 词法作用域就是在词法分析时定义的作用域.换句话说,词法作用域是你在写代码的时候,变量和代码块的位置决定的,因此在词法分析时也是固定不变的了. 注:有一些方法可以欺骗词法作用域,从而在词法分析结束之后,修改词法作用域.但好的实践是避免使用这些方法,让词法作用域只经过词法分析,也就是说完全保持编写时的作用域. 下面这段示例代码有三个嵌套作用域, 圈 1 包含了全…
× 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作模型导致的,作用域分为词法作用域和动态作用域,分清这两种作用域模型就能够对变量查找过程有清晰的认识.本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成…