调用对象位于作用域链的前端,局部变量(在函数内部用var声明的变量).函数参数及Arguments对象都在函数内的作用域中--这意味着它们隐藏了作用域链更上层的任何同名的属性. 2010年9月14日,我去参加网易网页工程师招聘会,应聘JS工程师职位.有幸参加笔试,然后有幸栽在笔试,呵呵.废话少说,抓出音响极深的一题重新研究研究. 题目大概是:写出如下代码的输出结果并进行分析 var tt = 'aa'; function test(){ alert(tt); var tt = 'dd'; ale…
前段时间在每天往返的地铁上抽空将 <你不知道的JavaScript(上卷)>读了一遍,这本书很多部分写的很是精妙,对于接触前端时间不太久的人来说,就好像是叩开了JavaScript的另一扇门,很多内容醍醐灌顶!所以决定将这本书分四个部分整理出来,同时也这本书强烈推荐给正在进阶的小伙伴们.这篇博文主要整理第一部分 作用域. 词法作用域 理解作用域 首先要介绍下JS参与程序 var a = 2的处理过程的演员表: 引擎 从头到尾负责整个JavaScript 程序的编译及执行过程. 编译器 引擎的好…
关于 Javascript 的函数作用域.调用对象和闭包之间的关系很微妙,关于它们的文章已经有很多,但不知道为什么很多新手都难以理解.我就尝试用比较通俗的语言来表达我自己的理解吧. 作用域 Scope Javascript 中的函数属于词法作用域,也就是说函数在它被定义时的作用域中运行而不是在被执行时的作用域内运行.这是犀牛书上的说法.但"定义时"和"执行(被调用)时"这两个东西有些人搞不清楚.简单来说,一个函数A在"定义时"就是 functio…
在 JavaScript 作用域不完全指北 中,我们介绍了作用域的概念以及 JavaScript 引擎.编译器和作用域的关系.作用域有两种主要的工作模型:词法作用域和动态作用域.其中最为普遍的也是大多数编程语言所采用的是词法作用域,我们主要对其进行研究学习.在传统编译语言的流程中, 程序中的一段源代码在执行之前会经历三个步骤, 统称为"编译". 分词/词法分析(Tokenizing/Lexing) 这个过程会将由字符组成的字符串分解成(对编程语言来说) 有意义的代码块, 这些代码块被称…
[问题]分别求下面程序的输出结果: 1. <script type="text/javascript"> var a = 10; sayHi(); function sayHi() { a = a + 10; document.write(a); } document.write(a); </script> --输出:20 20 2. <script type="text/javascript"> var a = 10; sayH…
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> //1 ==================================================== var a; if ('a…
在js学习中,词法作用域是必须要掌握的! 在这里,我将总结一下<你不知道的JS>一书中词法作用域的重点并分享给大家! 首先带来一段代码示例: function foo(){ console.log(a); } function bar(){ var a = 3; foo(); } var a = 2; bar(); js词法作用域输出结果:"2"; 动态作用域输出结果:"3" 下面我将对两种作用域的输出结果进行分析: #在对结果分析之前首先我们要了解的是…
一.JS闭包. f = function() {return true;};    g = function() {return false;};    (function() {       if (g() && [] == ![]) {          f = function f() {return false;};          function g() {return true;}       }    })();    alert(f()); // true or fal…
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> // 词法作用域: // 在js中只有函数能够形成一个作用域, 所以, 词…
作用域 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.可以说,变量和函数在什么时候可以用,什么时候被摧毁,这都与作用域有关. JavaScript中,变量的作用域有全局作用域和局部作用域两种. 1. 全局作用域(Global Scope) 在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域: (1)最外层函数和在最外层函数外面定义的变量拥有全局作用域 (2)所有末定义直接赋值的变量自动声明为拥有全局作用域 (3)所有window对象…
 原文链接:                 http://www.nowamagic.net/librarys/veda/detail/1305 作用域(scope) JavaScript 中的函数属于词法作用域,也就是说函数在它被“定义时”的作用域中运行,而不是在“被执行时”的作用域内运行. 什么是“定义时”? 什么是 “被执行时”? 定义时: 一个函数A在“定义时”就是 function A() { }这个语句执行的时候,就是定义这个函数的时候. 被执行时: A“被执行时”(被调用的时侯)…
作用域 域,表示的是一个范围,作用域,就是作用范围. 作用域说明的是一个变量可以在什么地方被使用,什么地方不能被使用. 块级作用域 JavaScript中没有块级作用域 { var num = 123; { console.log( num ); } } console.log( num ); 上面这段代码在JavaScript中是不会报错的,但是在其他的编程语言中(C#.C.JAVA)会报错. 这是因为,在JavaScript中没有块级作用域,使用{}标记出来的代码块中声明的变量num,是可以…
在前一篇文章中,我们把作用域定义为"管理.维护变量的一套规则",接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是动态作用域, Javascript采用的是词法作用域, 关于动态作用域的有兴趣的可以自行Google. 1.词法阶段 首先我们要理解"词法阶段"这个词语,我们已经了解到Js存在一个编译阶段,编译阶段的第一步就是分词/词法分析,我们可以简称为"词法阶段" 简单来说,词法作…
大家应该写过下面类似的代码吧,其实这里我想要表达的是有时候一个方法定义的地方和使用的地方会相隔十万八千里,那方法执行时,它能访问哪些变量,不能访问哪些变量,这个怎么判断呢?这个就是我们这次需要分析的问题——词法作用域 var classA = function () { this.prop1 = 1; } classA.prototype.func1 = function () { var that = this, var1 = 2; function a() { return function…
主要内容: 分析JavaScript的词法作用域的含义 解析变量的作用域链 变量名提升时什么 一.关于块级作用域         说到JavaScript的变量作用域,与咱们平时使用的类C语言不同. 例如C#中下面代码: static void Main(string[] args) { if(true) { int num = 10; } System.Console.WriteLine(num); } 这段代码如果进行编译,是无法通过的,因为"当前上下文中不存在名称num". 因为…
varclassA = function(){ ; } classA.prototype.func1 = function(){ var that = this, ; function a(){ return function(){ alert(var1); alert(this.prop1); }.apply(that); }; a(); } var objA = newClassA(); objA.func1(); 大家应该写过上面类似的代码吧,其实这里我想要表达的是有时候一个方法定义的地方…
词法作用域定义实现的规则: 1 函数作用域实在定义的时候决定的,而不是在执行时候决定 2 为了实现这种词法作用域,函数内部不仅包含函数代码逻辑,还必须引用当前的作用域链. 3 函数对象可以通过作用域链相互关联起来,函数内部的变量都可以保存在函数作用域内. 变量作用域:变量的作用域是程序源代码中定义这个变量的区域. 1在函数内部,局部变量的优先级要高于同名的全局变量. 2 JS是函数作用域 3 函数作用域:变量在声明它的函数体内以及该函数内部嵌套的函数体内都有定义. 4 JS的函数作用域指的是:在…
所谓的 词法( 代码 )作用域, 就是代码在编写过程中体现出来的作用范围. 代码一旦写好, 不用执行, 作用范围就已经确定好了. 这个就是所谓词法作用域. 在 js 中词法作用域规则: 1.函数允许访问函数外的数据. 2.整个代码结构中只有函数可以限定作用域. 3.作用规则首先使用提升规则分析. 4.如果当前作用规则中有名字了, 就不考虑外面的名字. 在编译语言中,**通常** 代码在被引擎执行之前会经历三个步骤: 1. 词法分析(tokenzing/lexing)2. 解析/语法分析(pars…
JS引擎 编译与执行 Javascript引擎会在词法分析和代码生成阶段对运行性能进行优化,包含对冗余元素进行优化(例如对语句在不影响结果的情况下进行重新组合). 对于Javascript来说,大部分情况下编译发生在代码执行前的很短时间内,涉及的概念有引擎.编译器.作用域. 变量声明例如var a = 2这条表达式,编译阶段会先查询作用域是否有同名变量,如果有就忽略声明(仅仅忽略var的声明),继续编译.如果没有,会在当前作用域的变量集合中创建一个变量,命名为a. { //编译阶段找不到a 执行…
事实上JavaScript并不具有动态作用域,它只有词法作用域,简单明了,但是this机制某种程度上很像动态作用域 词法作用域:是一套引擎如何寻找变量以及会在何处找到变量的规则,它是定义在词法阶段的作用域,是由写代码时将变量和块作用域写在哪里来决定的. 动态作用域:动态作用域并不关心函数和作用域是如何声明以及在何处声明的,只关心它们从何处调用.类似this的指向问题 例子 function foo(){ console.log(a); } function bar(){ var a=3; foo…
原文:你不知道的js系列 词法作用域(Lexical Scope) Lex time 一个标准的编译器的第一个阶段就是分词(token化) 词法作用域就是在词法分析时定义的作用域.换句话说,词法作用域是你在写代码的时候,变量和代码块的位置决定的,因此在词法分析时也是固定不变的了. 注:有一些方法可以欺骗词法作用域,从而在词法分析结束之后,修改词法作用域.但好的实践是避免使用这些方法,让词法作用域只经过词法分析,也就是说完全保持编写时的作用域. 下面这段示例代码有三个嵌套作用域, 圈 1 包含了全…
所谓的 词法( 代码 )作用域, 就是代码在编写过程中体现出来的作用范围. 代码一旦写好, 不用执行, 作用范围就已经确定好了. 这个就是所谓词法作用域. 在 js 中词法作用域规则: 1.函数允许访问函数外的数据. 2.整个代码结构中只有函数可以限定作用域. 3.作用规则首先使用提升规则分析. 4.如果当前作用规则中有名字了, 就不考虑外面的名字. 在编译语言中,**通常** 代码在被引擎执行之前会经历三个步骤: 1. 词法分析(tokenzing/lexing)2. 解析/语法分析(pars…
预编译与函数词法作用域(Precompiled & Scoped) 预编译 Javascript脚本的宿主在执行代码之前对脚本做了预编译处理,比如浏览器对Js进行了预编译,编译器会扫描所有的声明(变量.函数.对象,无论它们是否嵌套在其他函数中,都会被扫描),对声明进行编译,编译期间会忽略任何可执行的语句,直到编译结束后才会调用解释器对代码进行执行. 1.为声明的变量(变量式函数被视为变量)划分内存空间,标识符=Undefined(未初始化),执行时才会发生初始化. 2.为所有声明式函数划分内存空…
多年以前,当我怀揣着前端工程师的梦想时,曾经认真阅读过<JavaScript高级程序设计(第2版)>.里面有一个问题(P147),让我一直百思不得其解. function createFunctions(){ var result = new Array(); for(var i = 0; i < 10; i++){ result[i] = function() { return i; } } return result; } var funcs = createFunctions();…
× 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作模型导致的,作用域分为词法作用域和动态作用域,分清这两种作用域模型就能够对变量查找过程有清晰的认识.本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成…
function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); 上面的代码,控制台输出2,说明 JavaScript 没有动态作用域,只有词法作用域. 函数在申明时就决定了它的作用域,而不是在调用时,这就导致函数在功能封装上要注意不要随意引用外部变量. 不过通过改变 this 可以一定缓解没有动态作用域的情形. 主要区别:词法作用域是在写代码或者说定义时确定的,而动态作用域是在…
JavaScript 采用的是 词法作用域 的工作模型. 定义 词法化:大部分标准语言编译器的第一个工作阶段叫词法化(单词化),这个过程会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词意义. 词法作用域:定义在 词法阶段 的作用域. 词法作用域由谁决定:由你在写代码时将 变量 和 块作用域 写在哪里来决定.因此大部分情况下,词法分析器处理代码时会保持作用于不变. [例] function foo(a){ ; function bar(c){ console.log(a, b, c…
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 x = "globol value"; var getValue = function(){ alert(x); //弹出"undefined" var x = "local value"; alert(x); //弹出"…