变量的就进原则
<script>
var variable-one = "variable-one";
var variable-two = "variable-two";
function fn-one() {
console.log(variable-one);
console.log(variable-two);
var variable-two = "xige";
console.log(variable-two);
}
fn-one();
//输出结果:hello undefined xige
//变量会先在函数中找,找不到时才会在函数外找,运行console.log(variable-two);这步时variable-two还没被声明。
</script>
javascript的词法作用域
- 函数运行在定义它的作用域中,而不是调用它的作用域中。
2.利用以上两点可以把变量包裹在匿名函数中加以保护。可以这样创建类的私用变量。
var baz;
(function(){
var foo=10;
var bar=2;
baz=function(){
return foo * bar;
}
})()
//加入我们在全局定义foo=4; bar=5; baz()调用之后还是20;
baz();
如果该变量是定义在for或者if这样的代码块,在代码之外也是可见。
声明提前
JavaScript函数里声明的所有变量(并未涉及到赋值),都被提前至函数体的顶部
var scope="global";
function(){
//undefind,虽然在函数体内都是有定义,但是声明的提前并没有把值提前,既变量初始化留在原来的位置。
console.log(scope);
//变量在这里赋值,但变量本身在函数体内任何地方均是由定义的(函数作用域的特性),也就是说,在函数体内局部变量遮盖了同名的全局变量。只有程序执行到var语句的时候,局部变量才会被真正的赋值
var scope="local";
console.log(scope);
}
//在具有块级作用域的编程语言中,在狭小的作用域里让变量和使用变量的代码尽可能靠近彼此。