深入理解JavaScript系列:作用域链(scope chain)


点击查看原文

作用域链

如果要简要的描述并展示其重点,那么作用域链大多数与内部函数相关。

ECMAScript 允许创建内部函数,我们甚至能从父函数中返回这些函数。

var x = 10;

function foo() { 
  var y = 20; 
  function bar() {
    alert(x + y);
  } 
  return bar; 
}

foo()(); // 30

这样,很明显每个上下文拥有自己的变量对象:对于全局上下文,它是全局对象自身;对于函数,它是活动对象。

作用域链正是内部上下文所有变量对象(包括父变量对象)的列表。此链用来变量查询。即在上面的例子中,“bar”上下文的作用域链包括AO(bar)、AO(foo)和VO(global)。

在进入上下文时函数声明放到变量/活动(VO/AO)对象中
var x = 10;

function foo() {
  var y = 20;
  alert(x + y);
}

foo(); // 30

[[scope]]是所有父变量对象的层级链,处于当前函数上下文之上,在函数创建时存于其中。

注意这重要的一点--[[scope]]在函数创建时被存储--静态(不变的),永远永远,直至函数销毁。即:函数可以永不调用,但[[scope]]属性已经写入,并存储在函数对象中。

var x = 10;

function foo() {
  alert(x);
}

(function () {
  var x = 20;
  foo(); // 10, but not 20
})();

深入理解JavaScript系列:闭包(closures)

原文链接:http://www.cnblogs.com/TomXu/archive/2012/01/31/2330252.html

补充:基本类型和引用类型

基本数据类型

ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

typeof:检测一个变量是不是最基本的数据类型
a = 666;
typeof a;    // number 

more >>

深入理解JavaScript系列:函数(function)

原文链接:http://www.cnblogs.com/TomXu/archive/2012/01/30/2326372.html

JavaScript中三种函数类型

区别函数声明和表达式
function foo(){} // 声明,因为它是程序的一部分
  var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分

  new function bar(){}; // 表达式,因为它是new表达式

  (function(){
    function bar(){} // 声明,因为它是函数体的一部分
  })();
(function foo(){})  //表达式,他是表达式的原因是因为括号 ()是一个分组操作符,它的内部只能包含表达式

more >>

小彭子 <br> 记性不太好的<br>前端开发妹子一枚 <br> 博客记录前端知识学习<br>笔记和平时生活七七八八