js在函数中执行函数 它的执行环境是什么 本帖最后由 joygarden 于 2010-10-29 15:30:19 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 执行一遍,function SuperType(){this.colors = ["red", "blue", "green"];}//如这里的执行环境是globle 所以window获得了color属性//SuperType();//alert(window.colors);function SubType(){//这里的执行环境是什么?谁得到了colors属性SuperType();//无法得到colors值alert(window.colors);alert(this.colors);}var instance = new SubType();//无法得到colors值alert(instance.colors);弄明白了吗?呵呵~ 哦 它的scope 还是globle的啊 你这里的是想要弄明白this的指向吧?如果SuperType被new了,那么this指向他自己,如果没有被new直接调用,那么this指向他的父对象,没有父对象,指向最顶层(window)。这个与你在哪个函数里调用它没有关系,因为你声明supertype的时候是声明的全局的。 在SubType(){}里面加上alert(window == this);看看,这个作何解释呢? <script>function SuperType(){ this.colors = ["red", "blue", "green"];}//如这里的执行环境是globle 所以window获得了color属性SuperType();alert('window被赋值'+window.colors);function SubType(){ SuperType(); //还是给window添加,它没有new,所以它的this还是指向声明的时候的父对象,即window alert(this.colors); //没有new的时候this是window,new了this就是这个类的实例。}SubType(); //还是window被赋值var instance = new SubType(); //new了,它以后this弹出的都是自己的东西了,但是构造函数调用的SuperType里的this还是指向window,不会给这个实例添加属性的。alert(instance.colors); //构造函数执行的只是为window赋值,与实例无关,所以是undefined</script> alert(window == this); SubType();是truenew SubType();则是false解释应该如4楼说的吧 这才是js的精髓。一个是灵活的this,一个是闭包。想玩的话,还有更好玩的。var abc = {};abc.aaa = 'aaa';function showaaa(){ alert(this.aaa);}showaaa.call(abc); 这个例子是call执行function可以传递对象 改变this指向原因吧, Constructor Stealing方式继承也是用这个实现的ps: 正在看javascript高级程序设计第二版 的Constructor Stealing一节 jsquery 或者js 根据表格行id 合并单元格 jquery怎样接受函数的参数? 关于iframe内存泄露问题!80分悬赏! 同一个页面显示2个滑动窗口 新手现眼,FrontPage2003作的线条显示问题 document.wirte 这个正则实在太难了,,搞了几年了,发现特别难写,,求高手给个答案~~谢谢 急~!如何把实现把一个table动态分成几个talbe 请问用javascript添加了表格的一行后,如何确定它是第几行! 如何利用javascript调用sql? 正则表达式 高亮显示关键字 SetTimeOut为什么不起效果
this.colors = ["red", "blue", "green"];
}//如这里的执行环境是globle 所以window获得了color属性
//SuperType();
//alert(window.colors);function SubType(){//这里的执行环境是什么?谁得到了colors属性
SuperType();
//无法得到colors值
alert(window.colors);
alert(this.colors);
}var instance = new SubType();
//无法得到colors值
alert(instance.colors);
弄明白了吗?呵呵~
如果SuperType被new了,那么this指向他自己,如果没有被new直接调用,那么this指向他的父对象,没有父对象,指向最顶层(window)。
这个与你在哪个函数里调用它没有关系,因为你声明supertype的时候是声明的全局的。
在SubType(){}里面加上
alert(window == this);
看看,这个作何解释呢?
<script>
function SuperType(){
this.colors = ["red", "blue", "green"];
}
//如这里的执行环境是globle 所以window获得了color属性
SuperType();
alert('window被赋值'+window.colors);function SubType(){
SuperType(); //还是给window添加,它没有new,所以它的this还是指向声明的时候的父对象,即window
alert(this.colors); //没有new的时候this是window,new了this就是这个类的实例。
}
SubType(); //还是window被赋值var instance = new SubType(); //new了,它以后this弹出的都是自己的东西了,但是构造函数调用的SuperType里的this还是指向window,不会给这个实例添加属性的。
alert(instance.colors); //构造函数执行的只是为window赋值,与实例无关,所以是undefined</script>
alert(window == this);
SubType();是true
new SubType();则是false
解释应该如4楼说的吧
一个是灵活的this,一个是闭包。
想玩的话,还有更好玩的。var abc = {};
abc.aaa = 'aaa';
function showaaa(){
alert(this.aaa);
}
showaaa.call(abc);