1、函数作用域:
先看一段代码:
var str="global";
function fun(){
console.log(str);
var str="local"
console.log(str);
}
fun();
第一个打印的是 undefined
第二个打印的是local
初学者可能会认为第一句会输出global,因为代码还没执行到console.log(var str=“local”);所以肯定会输出global。
但是我们要明白js的函数作用域和Java等的块级作用域(es6中js新增加了块级作用域)
所谓的函数作用域也就是:变量在声明他们的函数体以及这个函数体嵌套的任意函数体内都是有定义的;
所以当上述代码写成如下形式时:
var str="global";
function fun(){
var str;
console.log(str);var str="local"
console.log(str);
}
fun();
所以:
第一个打印的是 undefined
第二个打印的是local
在函数fun里出现了console.log(str) 首先会在fun内用关键字var声明一个str 但是这个变量还没有被赋值,所以先存储了一个值为undefined
所以打印出来的值也是 undefined。
我们看一段代码:
var str="global";
if(1){var str="local";
console.log(str)
}
console.log(str);
打印结果都为 local 如果有块级作用域,if语句在{}内肯定会创造一个在{}内的局部变量 str;并不会修改第一行全局的str。然而结果并不是,所以js没有块级作用域。
2、变量作用域
先看一段代码:
function fun(){
if(1){
str="scope";
for(var i=0;i<2;i++)
;
}
console.log(i);
}
fun();
console.log(s);
函数fun中 str之前没有加 var 在函数内部 变量之前不加var,则默认这个变量是全局(window.s),而且是顶层对象的属性