JavaScript中作用域和作用域链的理解

初学js时一直对js的作用域、作用域链、闭包等问题感到很模糊,不能很好理解。学习js肯定要学习作用域,js的作用域和其他主流语言的作用域还是存在很大区别

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),而且是顶层对象的属性

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值