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()); // privatestaticconsole.log(func2.getPrivateStatic()); // privatestaticconsole.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})()
js作用域链的查找规则