function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); 上面的代码,控制台输出2,说明 JavaScript 没有动态作用域,只有词法作用域. 函数在申明时就决定了它的作用域,而不是在调用时,这就导致函数在功能封装上要注意不要随意引用外部变量. 不过通过改变 this 可以一定缓解没有动态作用域的情形. 主要区别:词法作用域是在写代码或者说定义时确定的,而动态作用域是在…
多年以前,当我怀揣着前端工程师的梦想时,曾经认真阅读过<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();…
这个概念是js中相当基础也是极为重要的,很多想当然的错误或感觉怪异的问题都是和这个东西有关.所以,本文主要说下这个名词的概念以及讨论下他牵扯出来的有关变量.函数.闭包的问题. 由变量开始谈 习惯性先来段代码: var x = "globol value"; var getValue = function(){ alert(x); //弹出"undefined" var x = "local value"; alert(x); //弹出"…
调用对象位于作用域链的前端,局部变量(在函数内部用var声明的变量).函数参数及Arguments对象都在函数内的作用域中--这意味着它们隐藏了作用域链更上层的任何同名的属性. 2010年9月14日,我去参加网易网页工程师招聘会,应聘JS工程师职位.有幸参加笔试,然后有幸栽在笔试,呵呵.废话少说,抓出音响极深的一题重新研究研究. 题目大概是:写出如下代码的输出结果并进行分析 var tt = 'aa'; function test(){ alert(tt); var tt = 'dd'; ale…