从书上看到作用域内的this指向作用域的调用对象,但是下面这个情况让我很不解
var x1=7;
var t={
x1:2,
x2:{x3:this.x1}
};
alert(t.x2.x3);//为什么这里输出7,按理说调用x2的是t啊,本以为this应该指向t,但是事实上this指向了windowvar y={
x1:2,
x2:function(){return this.x1}
};
alert(y.x2());//这里输出2我知道原因,是因为调用x2的对象是y所以this指向y另外:
var a=6;
function A(){
var a=8;
function B(){
alert(this.a);//为啥这里输出6,按理说调用B()的是A()作用域的call Object吧,该输出8啊!完全晕了..........
}
B();
alert(this.a);
}
A();
因为t不是OBJECT,只是一个JSON数据格式
function A(){
var a=8;----->变成 a=8 ,看看什么结果?呵呵最上面的a=6是全局变量,下面的 var a=8是局部变量定义,因此虽然同名但“以全局为重”
所以ALERT出来6;变成a=8就意味着重新定义全局变量a=8了,所以ALERT出来8;
var y={
x1:2,
x2:function(){return this.x1}
};
alert(y.x2());//这里输出2我知道原因,是因为调用x2的对象是y所以this指向y
为什么function回把JOSN格式当做调用对象
var t={ ... this }this不是function里面----------------------
为什么默认this是window对象~~你也可以这样看~~function Window(){
//core inti....
//....
//.... //user code start
var x1=7;
var t={
x1:2,
x2:{x3:this.x1}
};
}
window=new Window();只是打个比方~~
例如:
var y={
x1:2,
x2:function(){return this.x1}
};
this指向y(看到大多数人说是因为this指向调用对象,所以指向y,再加上你刚才的回答就说明JSON数据格式可以做函数的调用对象)
但是请看这里:
var a=6;
function A(){
var a=8;
function B(){
alert(this.a);//为啥这里输出6,按理说调用B()的是A()作用域的call Object吧,该输出8啊!完全晕了..........
}
B();
alert(this.a);
}
A();
this指向了全局调用对象window,既然function也是一种对象,为什么this不指向A,我看到犀牛书说过:一个函数在调用的时候回先在当前作用域内建立一个调用对象(call Object),这里相对于B()CALL OBJECT也就是A(),那么按道理说B()内的this该指向FUNCTION A但是事实上他输出的是全局作用域的var a=6,说明指向了全局作用域,这就是我就不明白的地方
function A(){
var a=8;
function B(){
alert(this.a);//为啥这里输出6,按理说调用B()的是A()作用域的call Object吧,该输出8啊!完全晕了..........这里你理解错误了
}
B();//你这里调用只是B函数,这里的this指的是window,那么this.a调用的是window的对象,即是全局对象
alert(this.a);
}
A();
x1:2,
x2:function(){return this.x1}
};
alert(y.x2());//这里输出2我知道原因,是因为调用x2的对象是y所以this指向y,但是你知道为什么指向y吗?
和
x2:{x3:this.x1}
你看出区别来没?明白这2个的区别,你也就明白了为什么指向不同一点点指点给你,让你自己领会,你理解就会更进一层
作用域大致为两个:语法作用域和函数作用域
this:是指向作用域的调用对象,所以前提是形成了作用域。
所以对于第一段代码var x1=7;
var t={
x1:2,
x2:{x3:this.x1}
};
alert(t.x2.x3);//因为这里的this没包含在语法或函数里,没有作用域,所以它指向到最外的window对象。
第二段代码和一正好对比
var y={
x1:2,
x2:function(){return this.x1}
};
alert(y.x2());//这里因为this在函数里形成了作用域,所以this指向了调用作用域的对象y,y.x1 = 2.var a=6;
function A(){
var a=8;
function B(){
alert(this.a);//这里不存在A调用B的关系,A和B是同级嵌套关系,this存在B的作用域里,如果不存在就溢出到外面的window了
}
B();
alert(this.a);
}
A();这是我自己的想法。。不知道对错
var x1=2;var t=function(){var x1=9;var x={x1:1,x2:{x3:this.x1,x4:{x5:this.x1}}};alert(x.x2.x3+" "+x.x2.x4.x5);};
t();因为this指向函数的调用对象也就是windows所以还是2,是这样嘛?
方法,作用域,闭包是通过function实现的
没有function就不用说那些东西了至于这里
function B(){
alert(this.a);//为啥这里输出6,按理说调用B()的是A()作用域的call Object吧,该输出8啊!完全晕了..........
}
B();
关键就是弄清楚到底是什么调用了b
那就要明白什么才是调用
例如
a.b()
这样我们就说a调用了b
那对于lz那个情况是
function a(){
b();
}
a();
应该说a中执行了一个方法b
可以说两者完全不同
那到底是什么调用了b
js中如果没有显式注明,那么默认会用window来调用
实际上是
function a(){
window.b();
}
a();
用with的时候就不一定要a.b()这个形式了