【这个问题有点难】关于with,大神请进。
javascript吧
全部回复
仅看楼主
level 1
韩版花泣 楼主
var funcA = new Object();
funcA.url = "http://www.baidu.com/";
funcA.qs = "s?wd=2";
var s2 = function(){
alert( test );
var qs = "s?wd=1";
with(funcA){
var qs = "???";
var test = url + qs;
}
alert( test );
alert( "var qs = " + qs );
return test;
}
alert( s2() );
2018年05月30日 20点05分 1
level 1
韩版花泣 楼主
我知道执行上下文,也知道作用域链,现在在学with的延长作用域链。
现在就是有个小小的问题。
第一个alert会显示undefined我知道,
第二个alert会显示http://www.baidu.com/???,我就有点不明白了,除非with也有一个执行上下文,那我就能明白。但是如果真是那样,第三个alert为什么会是s?wd=1呢?
这题是我自己出的,为了验证with中出现同名的属性会如何处理,
请大神指点。
2018年05月30日 21点05分 2
@丶沉默i 问题就在这里,你看看with块中的var qs = "???";既然是添加到所处函数的作用域,那所处函数的作用域中也有一个qs,对吧?那就应该覆盖了qs的值才对,不然这个with块中的qs是保存在哪里的呢?
2018年05月31日 02点05分
如果覆盖了qs的值,那么第三个alert应该显示"???",然而实际上显示的却是“s?wd=1",这真是太奇怪了。
2018年05月31日 02点05分
再说第二种可能,就是没有覆盖,如果没有覆盖的话,那with块中的var qs是保存在哪里的呢?。。。。。。。。。。迷之可怕。。。。。。。。
2018年05月31日 02点05分
@丶沉默i 我也调试了,with内部的qs的确改变了函数内的qs值,不过奇怪的是,当with块结束的时候,qs的值又变回去了,笑哈哈。搞不懂啥意思。[呵呵],好吧,虽然还是不知道原因,但还是谢谢你啦。
2018年05月31日 02点05分
level 1
韩版花泣 楼主
不要沉啊,有大神吗。
2018年05月30日 22点05分 3
level 1
韩版花泣 楼主
别沉啊。
2018年05月30日 23点05分 4
level 1
[呵呵]with 和 eval估计一样都被遗忘了
2018年05月31日 00点05分 5
@丶沉默i 好吧,谢谢。
2018年05月31日 01点05分
level 12
with几乎不用 ,主要是延长作用域链。这语法是为了重复代码写的少一点,但是加强了代码复杂性,弊大于利。
2018年05月31日 01点05分 6
书上也是这么说的,但是我很想弄明白这里的原因,这个题是我自己出的,但是我自己解不开。
2018年05月31日 02点05分
@韩版花泣 好久之前看过这个,实际中不怎么用我也有点忘了
2018年05月31日 02点05分
@夕阳西下Ysky 还是谢谢啦。
2018年05月31日 02点05分
level 1
韩版花泣 楼主
2018年05月31日 03点05分 8
补充一句:如果with块中的变量在追加的作用域中没有,但是在所处的函数的AO中有,那么就会改变AO中同名变量的值。
2018年05月31日 03点05分
level 1
韩版花泣 楼主
2018年05月31日 06点05分 11
level 1
看一下变量的作用域,跟with没有关系。
2018年05月31日 23点05分 12
with就是延长作用域,怎么没关系?常规的作用域链知识解释不了这一题,请层主看看清楚再回复,严谨一些。
2018年06月01日 00点06分
level 1
那我给你解释的详细一下,首先with中传过来的对象包含两个属性,一个是url另一个是qs。然后with里面又给了一个qs,这个时候从传过来的对象去找这个qs属性,很明显找到了,那么with上一行的那个qs属性值就不发生改变,改变的是传的对象中的qs属性,所以第二个alert弹出来的是你说的那样,又因为那个qs值没有改变,所以第三个弹出来是那样的。你可以把传过来的对象中qs属性取掉再回头理解一下就很清楚了,希望可以帮到你。
2018年06月01日 01点06分 13
问题就在这里,既然qs改变的是with传进来的AO中qs的值,那么test的检索怎么解释呢?它为什么没有被添加到with传过来的AO中?而是添加到其所在的函数的AO中呢?
2018年06月01日 03点06分
你只解释了qs,没有解释test。我一开始题问并不是不懂qs的行为,而是不理解qs和test两种行为方式的矛盾。不过这一题的解释我在11楼已经做出来了,我想我的解释没什么问题。
2018年06月01日 03点06分
我还是在说一遍吧,你把这题跑跑,仔细揣摩揣摩,你说的这段我们都懂,而问题并不在这里。你还是再好好看看吧,兄弟。
2018年06月01日 03点06分
1