javascript问题
<script>abc="abcdd";functionfoo(){varabc="dsfadf";varbar=function(){alert(this);//win...
<script>
abc="abcdd";
function foo(){
var abc="dsfadf";
var bar= function () {
alert(this);//window也就是global
alert(this.abc);//abcdd
alert(abc);//"dsfadf" ==>这三个值我都明白,但请看下面我改动后就不一样了。
}();
};
foo();
abc="abcdd";
var foo = {
abc:"dsfadf",
bar: function () {
alert(this);//输出foo
alert(this.abc);//输出dsfadf
alert(abc);//输出abcdd==>这里我就迷惑了,前两个我都懂,
//就是这个怎么不是输出dsfadf呢,它不是在它的Scope
//中吗?大叔求解释??
}
};
foo.bar();
</script>
jinyc007回答到原理上了,看我追问他那断代码,我是这样理解是不是对的?
是不是只有一个函数(如p())才会产生一个执行上下文环境呢?函数里的变量(如foo) 如果是指向一个对象,对象是不会产生一个执行上下文环境对吧?,在这个函数(如p())上下文中只会保存有这个变量(如foo),也就是pcontext.AO里的一个变量?那对象里如果有函数(如bar)了才会产生另外一个相对pcontext的子执行上下文环境对吧?对象(如foo)里的属性(如abc)不在那函数的AO中对吧?如果真是这样的话我就理解了。 展开
abc="abcdd";
function foo(){
var abc="dsfadf";
var bar= function () {
alert(this);//window也就是global
alert(this.abc);//abcdd
alert(abc);//"dsfadf" ==>这三个值我都明白,但请看下面我改动后就不一样了。
}();
};
foo();
abc="abcdd";
var foo = {
abc:"dsfadf",
bar: function () {
alert(this);//输出foo
alert(this.abc);//输出dsfadf
alert(abc);//输出abcdd==>这里我就迷惑了,前两个我都懂,
//就是这个怎么不是输出dsfadf呢,它不是在它的Scope
//中吗?大叔求解释??
}
};
foo.bar();
</script>
jinyc007回答到原理上了,看我追问他那断代码,我是这样理解是不是对的?
是不是只有一个函数(如p())才会产生一个执行上下文环境呢?函数里的变量(如foo) 如果是指向一个对象,对象是不会产生一个执行上下文环境对吧?,在这个函数(如p())上下文中只会保存有这个变量(如foo),也就是pcontext.AO里的一个变量?那对象里如果有函数(如bar)了才会产生另外一个相对pcontext的子执行上下文环境对吧?对象(如foo)里的属性(如abc)不在那函数的AO中对吧?如果真是这样的话我就理解了。 展开
3个回答
展开全部
函数有执行环境,也就是所谓的作用域,每个执行环境有一个变量对象,保存着执行环境的变量和函数定义,它有一个默认属性,就是arguments。
调用函数(方法)就会保存当前执行环境,并进入被调用函数的执行环境。你的代码里,foo是对象,对象是一种数据类型。它作为执行环境中的变量对象的一个变量被保存,而不是作为作用域。
调用函数(方法)就会保存当前执行环境,并进入被调用函数的执行环境。你的代码里,foo是对象,对象是一种数据类型。它作为执行环境中的变量对象的一个变量被保存,而不是作为作用域。
更多追问追答
追问
你说得很好,说到原理上了,现在我明白了,修改后我能推测到是这样的了。
abc="ccccc";
function p(){
var abc ="bbbbb";
var foo = {
abc:"aaaaa",
bar: function ()
{
// var abc="gggg";
alert(this===foo);//输出true
alert(this.abc);//输出aaaaa
alert(abc);//输出bbbbbb
}
};
foo.bar();
};
p();
追答
对象它作为一个数据存在,而不是执行的代码,它的方法才是可以调用执行,通过this可以绑定到你想要指定的对象(相对于取这个数据)。执行环境,顾名思义,就是针对代码执行所构建的一个包含执行代码和数据(变量)的环境。
你理解的也差不多了,不过不是定义了函数(方法)就会有上下文环境,还要调用执行才行。
展开全部
这里是这样的,var foo={}这种写法是json格式的写法,相当于你定义了一个foo json,foo里面有两个属性,一个是abc,值是"dsfadf" ,另一属性是:bar,值是一个function()方法,如果你要访问这两个属性,可以用foo.属性或者this.属性。当foo.bar()时,相当于调用了foo的bar属性,执行里面的方法,所以在执行alert(abc)时,这里的abc根foo的属性没什么关系,找到的只是全局的abc。
上面的abc是方法里面的执行语句,当你执行那个方法时,就重新为abc赋值了。
上面的abc是方法里面的执行语句,当你执行那个方法时,就重新为abc赋值了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
abc是foo的一个属性,并不是它的作用域中定义的变量,foo的作用域中并没有出现一个名叫abc的变量,那么全局中存在的变量无法被覆盖,就会被读取。说的作用域,讨论的无非就是局部变量和全局变量,很显然都得是变量
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |