JavaScript的with语句
ringa_lee
ringa_lee 2017-04-10 16:08:39
[JavaScript讨论组]


这个with语句的作用域是obj,所以var x = 20也就是将obj.x设置为20,但是我下面的var y = 30,不是给obj.y设置值吗?为什么外面反应的却是undefined?

ringa_lee
ringa_lee

ringa_lee

全部回复(4)
高洛峰

1)foo函数通过obj.foo方式调用时,with(this)中的this指向obj
2)声明过的变量,多次声明是无效的,也就是说

with(this){
    var x=20;
    var y=30;
    console.log(y);
}

等价于

//因为obj.x属性已经存在声明过了,其实就是一个赋值语句 obj.x=20;
//因为obj.y属性不存在,并且在with语句块中,不会主动obj中添加属性y,那么y变量只在with作用域中有效
with(this){
    x=20;
    var y=30;
    console.log(y);//输出 30
}

3) 如果代码这样写

with(this){
    x=20;
    y=30;
    console.log(y);
}

那么我们将发现y是一个全局变量

var obj={
    x:10,
    foo:function(){
        with(this){
            var x=20;
            y=30;
            console.log(y);
        }
    }
}

obj.foo();//30
console.log(obj.x);//20
console.log(obj.y);//undefined
console.log(y);//30
迷茫

obj没有定义y属性

高洛峰

with语句中把对象obj里面的属性的优先级高于该with所在作用域中其他同名变量。
obj.foo() //调用的时候 你obj里的with(this)指针引用是obj.

也就是说with(this){...}的作用域链的最前面其实是this也就是obj.

这时候with(this){...}中对x,y赋值的操作它都会去作用域链最前端开始找

var声明的变量只在当前作用域有效。但是变量在生命前会在作用域中找变量

是否已经存在。如果存在就直接使用不用再声明

因为obj的作用域在最前面 所以找到了x,没有找到y.

y就变成了with(this){}这个作用域中的变量。

怪我咯

原对象没有y属性,你那个with函数里的y只是个普通变量而已。

而且不也不建议使用这个方法吗?

Using with is not recommended, and is forbidden in ECMAScript 5 strict mode. The recommended alternative is to assign the object whose properties you want to access to a temporary variable.

详细参考这里:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/with。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号