JS权威指南学习记录(2)eval函数

直接总结吧:

eval()直接调用时,它在调用它的上下文中执行。

        间接调用时,使用全局对象作为上下文作用域,并且无法读,写,定义局部变量和函数。

例子:

var geval = eval;//这里调用geval => 间接调用eval;

var x = "global", y = "global";

function fn(){                  //此函数直接调用eval()

    var x = "local";

    eval("x = x +'changed'");

    return x ;

}

function gn(){               //此函数间接调用eval()

    var y = "local";

    geval("y = y + 'changed'");

    return y;

}

console.log(fn(), x);//这里会输出localchanged global,这里的localchanged 就是fn中返回的结果,而全局属性x依然为global;

console.log(gn(), y);//这里会输出local globalchanged,解释一下原因:

    如前面所述,当间接调用eval()时,使用全局对象作为上下文作用域,并且无法读,写,定义局部变量和函数。

所以在gn()里面,就算var y = "local",geval()也是无法读取的,或者写的,它只能读到全局的var y = "global",最后就直接return了gn()里面定义的var y = "local";

但是又因为geval()使用全局对象作为上下文作用域,所以它在gn()里面,取得了全局的y = "global",

并使用 y = y + 'changed'改变了全局属性y的值为'globalchanged',所以console.log(gn(), y)输出了local globalchanged,前一个local为gn()直接return的,第二个globalchanged为全局y被geval()改变过的。

btw,我在提这个代码的时候一直提示,后来发现是如果标题中带了 eval()就会为非法字符,仿佛感受到了eval的威力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值