JS作用域

在js中函数嵌套是非常普遍的,在函数嵌套中,对变量是如何寻找的?

答:首先在函数内寻找,寻找不到则往外层寻找···直到全局(window)区域

看一段代码

var c = 5;
function t1(){
    var d = 6;
    function t2(){
        //var d = 3; // 去掉注释后的变化
        var e = 7;
        alert(c+d+e);
    }
    t2();
}
t1();

分析:
1,首先调用t1函数,而t1函数又调用t2函数
2,t2函数中,计算变量c,d,e的和,为18
3,去掉t2函数中注释,则变量d的值为3,最终alert15

关键字var的作用

var是在函数运行的上下文中,声明一个变量。
如果不加var,则仅仅只是一个赋值操作。

console.log(window.d);//undefined
console.log(window.e);//undefined
function t(){
    d =5;
    var e = 6;
}
t();
console.log(window.d);//5
console.log(window.e);//undefined

分析
1,js代码从上到下顺序执行,当执行第一,二行时,全局对象window下无属性de,而对象的赋值,非常简单,当执行到console.log(window.d)时,window对象就有了d属性,但是并没有赋值,因此输出undefined

2,继续向下执行,调用t函数,d=5没有关键字var,则仅仅是个赋值操作,寻找t函数的作用域内,没找到,继续寻找=》window,没找到,执行window.d;而var e = 6,是变量的声明,且在t函数内部。

3,因此最后两行console则分别输出5undefined

作用域的练习

【注意】
1,以window.xxx引用全局变量,寻找不到,作为某个属性不存在,返回undefined,变量定义了,但是没有赋值
2, 以XXX引用某变量,寻找不到,则报xxx is not defined 错误。变量未定义。

习题

function t1() {
    var d;
    function t2(){
        d = 5;
        e = 6;
    }
    t2();
}
t1();
console.log(e);
console.log(d);
console.log(window.d);

作用域考核

【注意】这是一个极容易又极容易出错的基础面试题。
自己先行分析运行后的结果,然后在看解释。

    var str1 = 'global';
    function t1(){
        console.log(str1);
        // str2 = 'local';//注释去掉后的运行结果
        console.log(str2);
        var str2 = 'local';
    }
    t1();

js代码自上而下执行,但是js代码在执行前有一个词法分析的过程。

1.词法分析

//此时str1定义但是未被赋值,
// 所以str1的值为undefined
var str1;
 t1{
  // 此时str2定义但是未被赋值,
  // 所以str2的值为undefined
  var str2;
 }

2.执行语句顺序为:

str1 = 'global';
console.log(str1);
console.log(str2);
str2 = 'local';

3.输出

 global 
 undefined
 //如果去掉第四行注释,`console.log(str2);`输出`local`

【下一篇:谈谈词法分析】
【欢迎关注,讨论,共同学习】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值