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来定义常量,const与let都具有块级作用域。
浙公网安备 33010602011771号