JS的变量作用域是离它最近的封闭语块或代码块,包含他们内部的函数.
在代码块中声明会被隐式的提升到封闭函数的顶部
1 function (){ 2 var x=0; 3 for(var i=0;i<n;i++){ 4 .... 5 } 6 var y=1; 7 }
上面的代码会被JS解释成下面的格式
1 function (){ 2 var x=0; 3 var y=1; 4 var i=0; 5 for(i<n;i++){ 6 .... 7 } 8 }
有时候我们会不小心的在函数内部重新声明了已有的变量
function text(x){ ...... for(var i=0;i<n;i++){ var x=i; } }
如果我们把变量的声明和赋值看做两部份,就会比较好理解JS (如var x=0;看做var x; x=0;) 根据隐式提升规则
function text(函数传入的值){ var x; var x; x=函数传入的值 ...... for(var i=0;i<n;i++){ x=i; } }
特殊情况 JS的异常捕获catch(x){} x的作用域仅在catch语块内
function test(){ var x="var",result=[]; result.push(x); try{ throw "exception"; } catch(x){ x="catch"; result.push(x); } result.push(x); return result; } test();//["var", "catch", "var"]