js变量作用域

变量在函数体内声明,作用域为整个函数体,函数体外不可引用该变量.

function exp() {

  var x = 1;

  x = x +1;

}

x = x + 2 

//ReferenceError! 

两个不同的函数各自申明了同一个变量,那么该变量只在各自的函数体内起作用.互不影响。

function foo() {
    var x = 1;
    x = x + 1;
}

function bar() {
    var x = 'A';
    x = x + 'B';
}

作用域链查找变量从函数内部开始,由内向外一直到全局作用域,查到变量后即停止。

延长作用域链可以使用with语句。

变量的提升:

JavaScript的函数定义会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部:

function foo() {
    var x = 'Hello, ' + y;
    alert(x);
    var y = 'XXX';
}

foo();

变量x和变量y的声明都会被自动提升,但是y的赋值不会被提升。等价于

function foo() {
    var y; // 提升变量y的申明
    var x = 'Hello, ' + y;
    alert(x);
    y = 'XXX';
}

由于JavaScript的这一怪异的“特性”,我们在函数内部定义变量时,请严格遵守“在函数内部首先申明所有变量”这一规则。

JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性.

块级作用域:

为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:

function foo() {
    var sum = 0;
    for (let i=0; i<100; i++) {
        sum += i;
    }
    i += 1; // SyntaxError
}

ES6标准引入了新的关键字const来定义常量,constlet都具有块级作用域。

posted on 2017-06-06 09:23  破晓i  阅读(80)  评论(0)    收藏  举报

导航