作用域链

2019-08-14  本文已影响0人  fly_198e

函数的作用域:

function fn() {
var a = 1 ;
if (a > 2){
var b = 3;
}
console.log(b);
}
fn();

console.log(a);
输出:undefined
      ReferenceError: a is not defined 
function f1() {
  var n = 999;
  function f2() {
  console.log(n); // 999
  }
}

上面代码中,函数f2就在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是 JavaScript 语言特有的”链式作用域”结构,子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

var:

在声明变量的时候需要var,这样声明变量作用域才符合我们上面提到的规则,那么不写var会怎样呢

function fn() {
a = 1;
}
fn();

console.log(a);
输出:1

什么是闭包:

function createIncrementor(start) {
  return function () {
    return start++;
  };
}

var inc = createIncrementor(5);

inc() // 5
inc() // 6
inc() // 7
function Person(name) {
  var _age;
  function setAge(n) {
    _age = n;
  }
  function getAge() {
    return _age;
  }

  return {
    name: name,
    getAge: getAge,
    setAge: setAge
  };
}

var p1 = Person('张三');
p1.setAge(25);
p1.getAge() // 25
上一篇 下一篇

猜你喜欢

热点阅读