共 2 条评论关于"理解js中的作用域链增强with上下文以及变量泄露问题"
最新评论
很多人可能不知道这个东西,也许你知道with关键字的作用在于改变作用域但会说它无用,但不管你是否知道或者支持with无用论,如果哪天有人拿它作为一道面试题,你事先没踩过这个坑或许难倒了你,下面结合实例理解下with。
1 2 3 4 5 6 7 8 | var obj = { a: 1, b: 2, c: 3 }; // 如果想获取obj中的字段你恐怕会这样 console.log(obj.a,obj.b,obj.c) |
1 2 3 | with(obj){ console.log(a,b,c) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | var a = null; function foo(obj) { with (obj) { a = 2; } } var o1 = { a: 3 }; var o2 = { b: 3 } foo(o1); console.log(o1.a); foo(o2); console.log(o2.a); console.log(a); // 答案:2 nudefined 2 |
浓缩点说:实例中原本想改变的是传进来的obj,如果obj有对应的a,那就把这个a给改变 = 2,如果发现obj中没有,那它也不会自动往obj上添加,但它会直接给全局增加一个a = 2,这就是with引起的变量泄露问题,想想上面我们一开始给全局定义了一个a初始化为null,但在后期使用with过程中某次修改失败,导致改变了全局的a,想想是不是有些可怕,这恐怕就是很多人支持with无用论的由来。
最新评论
支付宝扫一扫打赏
微信扫一扫打赏
MARK收藏。。。
厉害,受教了