Js作用域与闭包

  在JavaScript中,作用域是执行代码的上下文。作用域有三种类型:全局作用域、局部作用域(或“函数作用域”)和eval作用域。

  在函数内部使用var定义的代码,其作用域是局部的。

  

var foo = 0; // 全局作用域
console.log(foo); // 0

var myFunction = function() {  console.log(foo); // undefined (下面var foo的声明在此作用域提升)
  var foo = 1; // 局部作用域
  console.log(foo); // 1
  var myNestedFunction = function() {
    var foo = 2; // 局部作用域
    console.log(foo); // 2
  }
}

eval(‘var foo = 3; console.log(foo);‘); // eval()作用域 3

console.log(foo); // 3

  JavaScript没有块作用域

var foo = 1;

if (true) {
  foo = 2;
  for (var i = 3; i <= 5; i++) {
    foo = i;
    console.log(foo); // 3,4,5
  }
}

  在函数中使用var声明变量,避免作用域陷阱

var foo = function() {
  var boo = function() {
    console.log(doo) // undefined 声明提升
    var doo = 2;
  }()
  console.log(doo); // ReferenceError: doo is not defined. doo在boo作用域中
}()

var foo = function() {
  var boo = function() {
    doo = 2;
  }()
  console.log(doo); // 2, doo在全局作用域中
}()

  作用域链

var sayHiText = ‘hi‘;

var func1 = function() {
  var func2 = function() {
    console.log(sayHiText); // 在作用域链中寻找变量:func2-->func1-->global
  }()
}()

/*---------分割线------------*/

var x = false;var foo = function() {  var x = false;  var bar = function() {    var x = true;    console.log(x);   }()}

foo(); // true, 当作用域链最近位置查找到变量时,查找即结束

  函数定义时确定作用域,而非调用时确认

var foo = ‘head‘var parentFun = function() {
  var foo = ‘foo‘
  return function() {
    console.log(foo)
  }
}
var nestedFun = parentFun();

nestedFun(); // foo, 返回的函数可以通过作用域链访问foo

var otherFun = function() {  var foo = ‘other‘  nestedFun(); // foo, 作用域链 parentFun --> global}()

  闭包是由作用域链引起的

var countUpFromZero = function() {
  var count = 0;
  return function() {
    console.log(count++);
  }
}();

countUpFromZero (); // 0
countUpFromZero (); // 1
countUpFromZero (); // 2

  深入了解闭包:http://jibbering.com/faq/notes/closures/

时间: 2024-10-14 10:48:11

Js作用域与闭包的相关文章

js——作用域和闭包

1. js是编译语言,但是它不是提前编译,编译结果不能在分布式系统中移植.大部分情况下,js的编译发生在代码执行前的几微秒(甚至更短) 2. 一般的编译步骤 分词/词法分析:把字符串分解成词法单元 解析/语法分析:将词法单元转换成一个由元素组成的语法结构树,抽象语法树AST 代码生成:将AST转换成一组机器指令 3. 三个工具 引擎:控制整个程序的编译及执行过程 编译器:负责语法分析及代码生成等 作用域:收集并维护所有声明的标识符的访问权限 4. var a = 2 的编译过程 var a=2;

js系列-3 js作用域与闭包

4,函数作用域中可用arguments来获取函数实参,arguments虽然可以通过下标访问,但它不是数组,原型不是Array.prototype. 它是实参的一个副本,通过arguments可模拟方法的重载.    function add(){        if(arguments.length == 1){           alert(1);        }        if(arguments.length == 2){           alert(2);        }

js 作用域,闭包及其相关知识的总结

面试必问题,闭包是啥有啥子用,觉得自己之前回答的并不好,所以这次复习红皮书的时候总结一下. 提到闭包,相关的知识点比较多,所以先罗列一下要讲的内容. 1. 作用域链,活动对象 2. 关于this对象 3. 垃圾回收机制,内存泄漏 4. 模仿块级作用域,私有变量 涉及的内容这么多,也难怪面试官喜欢问这个问题啊,就像niko大神说的,应该是根据回答的深浅了解你的思维模式吧.废话不多说,开始步入正题. 1. 作用域链,活动对象 活动对象:活动对象就是在函数第一次调用时,创建一个对象,在函数运行期是可变

JS作用域与闭包--实例

//函数作用域 function func(){ var arr = [1,3,5,7,9]; var sum = 0; for(var i = 0,len = arr.length;i < len;i ++){ sum += arr[i]; } console.log("%d\t\n%d",i,sum); } func(); //5 //25 //闭包特性 var outter = []; function clouseTest(){ var arr = ["one&

JS中的作用域和闭包

作用域:在编程语言中,作用域控制着变量与参数的可见性及生命周期.JS确实有函数作用域,那意味着定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的. var a = 1; var fs = function (){ var b = 2; var c = 4 var fun = function (){ var c = 3; alert(a) //输出1 alert(b) //输出2 alert(c) //输出3 } fun(); } f

js面试题知识点全解(一作用域和闭包)

问题: 1.说一下对变量提升的理解 2.说明this几种不同的使用场景 3.如何理解作用域 4.实际开发中闭包的应用 知识点: js没有块级作用域只有函数和全局作用域,如下代码: if(true){ var name='killua' //把name定义在块里和放在外面是一样的,等同于在外面声明一个变量name,在块内给name赋值 }//同等于下面的代码 //建议用下面方式写 var name if(true){ name='killua' } console.log(name) //打印出来

解析js中作用域、闭包——从一道经典的面试题开始

如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎么写,是不是这样? 可是结果呢,弹出来的都是10,为啥? var i,a for(i=0;i<10;i++){ a=document.createElement('a') a.innerHTML=i+'<br>' a.addEventListener('click',function(eve

我不知道的js(一)作用域与闭包

作用域与闭包 作用域 什么是作用域 作用域就是一套规则,它负责解决(1)将变量存在哪儿?(2)如何找到变量?的问题 作用域工作的前提 谁赋予了作用域的权利?--js引擎 传统编译语言编译的过程 分词/词法分析:字符串 => 词法单元 var a=2; => var a = 2 ;(共5个单元) 解析/语法分析:词法单元流 => 抽象语法树(Abstract syntax tree,AST) 代码的生成: AST => 可执行代码(机器指令) js引擎编译的特点: 代码在执行前进行编

js最基础知识回顾3(字符串拼接,数据类型,变量类型,变量作用域和闭包,运算符,流程控制,)

一.javaScript组成     1.ECMAScript:解释器.翻译 ---------------------------------------------------------几乎没有兼容性问题     2.DOM:Document Object Model --------操作HTML的能力----document--------有一些兼容性问题     3.BOM:Browser Object Model -------------浏览器---------------wind