这js不理解,求解释

后浪 2011-07-21 04:13:12
小弟刚学js,请详解,逐步详解最好!

<script type="text/javascript" language="javascript">
var value = 0;
var god = {
value: 1,
method: function(){
var value = 2;
var innerObj = {//问题1 这个中括号神马意思,相当于一个类名么?里面装变量,方法?
value: 3,
innerMethod: function(){
var value = 4;
var that = this;
var anotherMethod = function(){
alert(that.value);//这个等价于1处 值为3
alert(this.value);//这个是0 ,this指的是window
alert(value); //这个等价于2处 值为4 问题2 不理解咩是闭包函数?
}
anotherMethod();
alert(this.value); //1处 问题3 这里的this为神马指到了上面的3,不是4?
alert(value); //2处 值为4
}
};
innerObj.innerMethod();
alert(this.value); // 值为1 这个跟上面是一个道理
alert(value); // 值为2 这个也是跟上面一个道理
},
method2: function(){
var value = 5;
alert(this.value);
alert(value);
return function(){
alert(this.value);
alert(value);
};
}()//这个括号是自己创建完就执行自身
};
god.method();
god.method2(); //问题4 这个方法可以得到值 0 5 1 5 解释?
</script>

...全文
84 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainsilence 2011-07-22
  • 打赏
  • 举报
回复
你要搞懂这个,要先弄清楚几个问题
1.
var obj = {};
这个代码,效果等同于
var obj = new Object();
原本是可以看成一个对象的。
但是由于最新的ECMAScript5标准(有了Object.create方法之后),他其实又可以看成是一个类。不过一般情况下你可以看成是一个对象,或者是单例模式中的单例对象。

2.this作用链
看以下代码
    var value = 0;

var obj = {
value: 1,
method: function() {
var handler = function() {
alert(this.value);
};
// 0
handler();
}
};
obj.method();



这里的this,之所以指向了全局的window["value"],是因为this链断了。在调用handler的时候,this无法指向obj。

再看以下代码:
    var value = 0;

var obj = {
value: 1,
method: function() {
this.handler = function() {
alert(this.value);
};
// 1
this.handler();
}
};
obj.method();



这里,打印出1,是因为this.value在执行的时候,向上查找,正好连到了this.handler,而this.handler指向obj。所以能解析出1

综上,来回答你的所有问题
问题1:可以看成是对象,也可以看成是类。看成是类的时候用Object.create实例化。
问题2:alert(value)的这个调用的确是用了闭包
问题3:看上面2的解释
问题4:首先解释两个5,都是闭包得到最近的var value的值。所以都是5
之所以第一次为0,原理和上面2的第一段代码一样。第二次为1,原理和第二段代码一样。第一次执行的时候并没有绑定在对象上,是匿名执行的。第二次是绑定在对象上执行。
lsw645645645 2011-07-21
  • 打赏
  • 举报
回复

上面解释很清楚了,楼主那么多分,给点嘛
confidenceyu 2011-07-21
  • 打赏
  • 举报
回复
<script type="text/javascript" language="javascript">
var value = 0;
var god = {
value: 1,
method: function(){
var value = 2;
var innerObj = {//这是一个对象,并不是类
value: 3,
innerMethod: function(){
var value = 4;
var that = this;
var anotherMethod = function(){
alert(that.value);//这个等价于1处 值为3 因为var that = this;将this转变
alert(this.value);//这个是0 ,this指的是window
alert(value); //这个看下js的域
}
anotherMethod();
alert(this.value); //这里的this指的是god这个对象,对象的value属性是3啊
alert(value); //你上面不是声明了 value=4吗
}
};
innerObj.innerMethod();
alert(this.value); // 值为1 这个跟上面是一个道理
alert(value); // 值为2 这个也是跟上面一个道理
},
method2: function(){
var value = 5;
alert(this.value); //window的value
alert(value); // 上面声明的value
return function(){
alert(this.value); //god以象的value
alert(value); //闭包的value
};
}()//这个括号是自己创建完就执行自身
};
god.method();
god.method2(); //问题4 这个方法可以得到值 0 5 1 5 解释?我的理解是闭包的作用。你搜下闭包
</script>
挨踢直男 2011-07-21
  • 打赏
  • 举报
回复
<script type="text/javascript" language="javascript">
var value = 0;
var god = {
value: 1,
method: function(){
var value = 2;
var innerObj = {//这是一个对象,并不是类
value: 3,
innerMethod: function(){
var value = 4;
var that = this;
var anotherMethod = function(){
alert(that.value);//这个等价于1处 值为3
alert(this.value);//这个是0 ,this指的是window
alert(value); //这里是4很合逻辑啊,有什么不对吗?
}
anotherMethod();
alert(this.value); //这里的this指的是god这个对象,对象的value属性是3啊
alert(value); //你上面不是声明了 value=4吗
}
};
innerObj.innerMethod();
alert(this.value); // 值为1 这个跟上面是一个道理
alert(value); // 值为2 这个也是跟上面一个道理
},
method2: function(){
var value = 5;
alert(this.value); //window的value
alert(value); // 上面声明的value
return function(){
alert(this.value); //god以象的value
alert(value); //闭包的value
};
}()//这个括号是自己创建完就执行自身
};
god.method();
god.method2(); //问题4 这个方法可以得到值 0 5 1 5 解释?
</script>
mstnsc 2011-07-21
  • 打赏
  • 举报
回复
这是用JavaScript中对象直接量方式创建对象。
mstnsc 2011-07-21
  • 打赏
  • 举报
回复
这是用JavaScript中对象直接量方式创建对象。
后浪 2011-07-21
  • 打赏
  • 举报
回复
本来想把问题弄红色的,弄成这样了!

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧