es5作用域

javascript作用域分为全局作用域和局部作用域。在全局作用域内定义的就是全局变量,即window对象上的局部变量;局部作用域是函数作用域,注意是函数作用域而不是大括号作用域!
function test() {
  var num = 1;
  if (true) {
    num = 2;
    alert(num); // 2
  }
  alert(num); // 2 
}
var scope="global";  
function t(){  
    console.log(scope);  // undefined,变量提升
    var scope="local"  
    console.log(scope);  // local
}  
t(); 
function Test() {
  var a = 1;
  this.b = 1;
  this.show = function() {
    alert('a=' + a);
    alert('b=' + this.b);
  }
  this.setValue = function() {
    a = 2;
    this.b++;
  }
}

var obj1 = new Test();
obj1.show(); // a=1,b=1;
var obj2 = new Test();
obj2.setValue();
obj2.show(); // a=2,b=2;
obj1.show(); // a=1,b=1;

上面的实例中,a是构造函数内部的一个变量,我们在实例化obj1和obj2之后,发现在实例化对象时,obj1和obj2各有一个作用域,其中的a并不是一份,而是不同的值。相互之间的操作并不影响。这里的a相当于私有变量,对于每一个对象来讲,也都是不同的。
(function() {
  var privateStatic = "privatestatic";
  Func = function() {
    this.setPrivateStatic = function(value) {
      privateStatic = value;
    }
    this.getPrivateStatic = function() {
      return privateStatic;
    }
  }
})();

var func1 = new Func();
var func2 = new Func();
console.log(func1.getPrivateStatic()); // privatestatic
console.log(func2.getPrivateStatic()); // privatestatic

console.log(func1.setPrivateStatic('changed'));
console.log(func2.getPrivateStatic()); //changed

(function b() {
  var c = 1;
  a(); // c is not defined
})()

function d() {
  var c = 2;
  console.log(c);
};

(function b() {
  var c = 1;
  d(); // 2
})()

clipboard.png

js作用域链的查找规则

https://www.cnblogs.com/dolph...
http://www.cnblogs.com/dolphi...
https://www.cnblogs.com/lhb25...
http://www.cnblogs.com/zxj159...
https://www.cnblogs.com/syfwh...
https://www.cnblogs.com/myyou...


hellobaby
147 声望5 粉丝

前端工程师