with 的疑惑? 本帖最后由 moliu 于 2009-10-29 09:47:05 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该是作用域的问题!!!不知道该怎么说~~~~function x(){alert(v)}; 函数内部的v,调用的是全局变量的v但是x=function x(){alert(v)}; 这种形式的时候,就像在with内部进行赋值表达式一样,用的v就是with对象的v了~~~ 第一个: x()内部的调用的v为全局变量v,所以值为10第二个: x()内部形成一个闭包,所以v并不在obj下,js编译器会往上查找,即window对象,故: function x(){alert(window.v)}; window.v即全局变量v,所以值为10第三个 代码可变相为obj.x=function x(){alert(this.v)} //this.v实际上就是obj.vobj.x();这样就明白为什么是2了纯属个人理解,不准期之处请高人指点! 这是IE的一个BUG.with并不会改变this指针指向.this还是指向window的但是在with中的所有变量会默认加上obj前缀例如:with(obj) { x=function x(){alert(v)}; x(); //输出 2 } 等价于obj.x=function x(){alert(obj.v)};obj.x();而前面的var v=10; var obj={v:2}; with(obj) { function x(){alert(v)}; x(); //输出 10,为什么 } 实际为obj.x = function(){alert(obj.v)};obj.x();但IE的bug把其误判为obj.x = function(){alert(v)};obj.x(); 由于var function会预定义ie把他们自动提前了第二个实际上是这样的效果function x(){alert(v)}; with(obj) { x(); //输出 10,为什么 } 但这其实不太合理因为根据静态作用域的定义作用域应该是根据被定义的位置的那应该包含了obj才对这个ff就比较正确 var v=10; var obj={v:2}; with(obj) { function x(){alert(v)}; x(); //在 firefox 下输出 2,我刚试过 } 谈笑有鸿儒往来无白丁 第三个比较复杂在ie中是这样的 function x(){alert(v)};with(obj) { x=function (){alert(v)}; x(); //输出 2 } ff中这样的with(obj) { x=function (){alert(v)}; x(); //输出 2 } 具体参考http://hax.javaeye.com/blog/230182 ff就是按照根据静态作用域的定义作用域所以包括了obj只是ie有问题 搞着搞着我也迷惑了.刚刚继续测试的时候发现.如果with(obj)时obj本身没有那个属性x则不会使用默认对象也就是不会将x化作obj.x 此网页上的错误可能会使它无法正确运行 一个很是郁闷的js问题,大神们帮帮忙! JS动态获得1个数组 保存起来以保证刷新后还存在 睡觉前结贴。希望高人无聊的时候给我看看 能否动态显示IE下的状态条? 我要做一个窗口从天而降,然后再依原路径返回。 为什么不能过滤英文和其他字符 outerHTML什么情况下会失效?javascript转换成vbscript?? 特殊 各位大哥,快来看看。小弟卡起了 js ajax传输数据中的问题? 图片轮流切换的问题 控制页面元素的问题
function x(){alert(v)}; 函数内部的v,调用的是全局变量的v
但是x=function x(){alert(v)}; 这种形式的时候,就像在with内部进行赋值表达式一样,用的v就是with对象的v了~~~
x()内部的调用的v为全局变量v,所以值为10
第二个:
x()内部形成一个闭包,所以v并不在obj下,js编译器会往上查找,即window对象,故:
function x(){alert(window.v)}; window.v即全局变量v,所以值为10
第三个
代码可变相为
obj.x=function x(){alert(this.v)} //this.v实际上就是obj.v
obj.x();这样就明白为什么是2了纯属个人理解,不准期之处请高人指点!
with并不会改变this指针指向.
this还是指向window的
但是在with中的所有变量会默认加上obj前缀
例如:
with(obj)
{
x=function x(){alert(v)};
x(); //输出 2
}
等价于
obj.x=function x(){alert(obj.v)};
obj.x();
而前面的
var v=10;
var obj={v:2}; with(obj)
{
function x(){alert(v)};
x(); //输出 10,为什么
}
实际为
obj.x = function(){alert(obj.v)};
obj.x();
但IE的bug把其误判为
obj.x = function(){alert(v)};
obj.x();
ie把他们自动提前了
第二个实际上是这样的效果
function x(){alert(v)};
with(obj)
{
x(); //输出 10,为什么
}
但这其实不太合理
因为根据静态作用域的定义作用域应该是根据被定义的位置的那应该包含了obj才对
这个ff就比较正确
var obj={v:2}; with(obj)
{
function x(){alert(v)};
x(); //在 firefox 下输出 2,我刚试过
} 谈笑有鸿儒
往来无白丁
在ie中是这样的
function x(){alert(v)};
with(obj)
{
x=function (){alert(v)};
x(); //输出 2
} ff中这样的
with(obj)
{
x=function (){alert(v)};
x(); //输出 2
} 具体参考
http://hax.javaeye.com/blog/230182
ff就是按照根据静态作用域的定义作用域
所以包括了obj
只是ie有问题
刚刚继续测试的时候发现.
如果with(obj)时
obj本身没有那个属性x
则不会使用默认对象
也就是不会将x化作obj.x