下面是百度今年的一个笔试题: jsthis闭包 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你没看到第二个 console.log("inner func: this.foo = " + this.foo); 是在内层中吗 第三个是一个自执行函数,在内层中没有foo的定义啊 var myObject = { foo:"bar", func: function() { var self = this; console.log("outer func: this.foo = " + this.foo); console.log("outer func: self.foo = " + self.foo); (function (){ console.log("zzzzz= " + (this==window)); console.log("inner func: self.foo = " + self.foo); }()); } } myObject.func(); 理所当然的,没人要的东西都属于top(这里是window). a.b() 这个时候 b里面的this是 a( ‘里面’ 指顺序代码快 )b.apply(a) b里面的this是ab.call(a) b里面的this是ab() 这个时候 b里面的this 是window基本就这么个原则 在怎么变化也就是这样 function outer(){ this.i = 10; alert(this.i); (function(){ alert(this.i); }()); }; outer(); 你的这个调用的时候没new,没new的,都是this都是指向window,所以匿名函数里可以找到i。你new outer()就是undefined了、 var myObject = { foo:"bar", func: function() { var self = this; console.log("outer func: this.foo = " + this.foo); console.log("outer func: self.foo = " + self.foo); function aa(){ console.log("inner func: this.foo = " + this.foo); console.log("inner func: self.foo = " + self.foo); } //这个跟是不是匿名的自执行函数没有太大关系吧,而是跟function的内部this执向有关的。 //function aa(){}这样的函数定义,内部的this默认都是指向window的,可以通过其他方式改变 //所以下面的调用方法,this=window aa(); //而下面的调用方法,则改变了this的指向 aa.call(this); }}myObject.func(); //例子:var name = "zhang";function getName(){ console.log(this.name);}var obj = { name:"ling", getName:getName}getName();//zhang 直接调用,this=windowgetName.call(obj); //ling 使用call强行把getName内部的this指向objobj.getName();//ling 在obj上调用,指向this=obj//上面的这些,只是想要说明,this的指向,跟它的使用方法有关。//跟这个函数,定义在哪个区域无关。var age = 2;var MyAge = { age:1, getAge:function(){ console.log(this.age); }}var newAge = MyAge.getAge;MyAge.getAge(); //1 this指向MyAgenewAge(); //2 this指向windownewAge.call(MyAge); //1 this指向MyAge 你自己写的函数this指向是window!!!所以this.i就是window.i,在哪里都可以找到。this是据以执行的对象,就是谁调用的,你写个函数,在window中调用,this自然指向window,百度面试题是使用对象调用,this指向对象~ 谢谢!也就是说像 function aa(){}这样定义、aa()这样调用的函数,不管在哪里定义、在哪里调用,都属于window调用对吧? 恩,看到了,是之前不知道像这样的定义调用方法this也是指向window。 差不多就是这样的,我现在还想不到什么特殊的,不符合的情况,function的函数,它的实质就属于引用类型的一种形式。var a = function (){ console.log("a");}b = a;a(); //ab(); //adelete a;//这个时候,a和b都指向的同一个函数引用。a = function(){ console.log("b");}//改变a的函数引用,但是b依然指向原来的函数a(); //bb(); //a//所以说,函数在被定义之后,就会一直存在,不管你是否引用。 恩,谢谢!不过最后这个结论好像不是这样。尽管之前delete了a,但因有b还指向被定义的函数,所以delete只是删除了a对它的引用,没有删除函数本身。后面又使a指向了新的函数,这时a和b是指向两个不同的函数了。若前面把a,b都delete了,可能函数就会被gc回收了。 额~~~竟然把delete带上了,这个不是要在这里说的,我当时想到了其他的东西,就拿来delete测试了一下,跟你这里的问题,无关的~~~函数是否会被回收,这个我也不太确定貌似匿名函数就不会被回收,还有就是应用了闭包的函数,就算丢失了引用,也不会被回收。 div oumouseout的使用问题????????? js如何延时执行下一条语句 请高手帮忙看下下面的代码那里有错,谢了. 怎么实现DIV容器?? 我的代码输出有问题?在线急等 从XML文档中读取数据在HTML中显示!come in look look! 如何记录按钮被点击的次数啊 dwr加载问题 求教jquery 鼠标滚动到底后,连续执行函数问题 如何得到图片大小 谷歌浏览器报错误 Uncaught TypeError: object is not a function register.jsp:53onblur 能否用js判断移动端是否黑屏,或关机等状态
foo:"bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo);
(function (){
console.log("zzzzz= " + (this==window));
console.log("inner func: self.foo = " + self.foo);
}());
}
}
myObject.func();
没人要的东西都属于top(这里是window).
b.apply(a) b里面的this是a
b.call(a) b里面的this是ab() 这个时候 b里面的this 是window基本就这么个原则 在怎么变化也就是这样
this.i = 10;
alert(this.i);
(function(){
alert(this.i);
}());
};
outer();
你的这个调用的时候没new,没new的,都是this都是指向window,所以匿名函数里可以找到i。你new outer()就是undefined了、
foo:"bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo); function aa(){
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}
//这个跟是不是匿名的自执行函数没有太大关系吧,而是跟function的内部this执向有关的。
//function aa(){}这样的函数定义,内部的this默认都是指向window的,可以通过其他方式改变
//所以下面的调用方法,this=window
aa();
//而下面的调用方法,则改变了this的指向
aa.call(this);
}
}
myObject.func(); //例子:
var name = "zhang";
function getName(){
console.log(this.name);
}var obj = {
name:"ling",
getName:getName
}getName();//zhang 直接调用,this=window
getName.call(obj); //ling 使用call强行把getName内部的this指向objobj.getName();//ling 在obj上调用,指向this=obj//上面的这些,只是想要说明,this的指向,跟它的使用方法有关。
//跟这个函数,定义在哪个区域无关。var age = 2;
var MyAge = {
age:1,
getAge:function(){
console.log(this.age);
}
}
var newAge = MyAge.getAge;
MyAge.getAge(); //1 this指向MyAge
newAge(); //2 this指向window
newAge.call(MyAge); //1 this指向MyAge
this是据以执行的对象,就是谁调用的,你写个函数,在window中调用,this自然指向window,百度面试题是使用对象调用,this指向对象~
谢谢!也就是说像 function aa(){}这样定义、aa()这样调用的函数,不管在哪里定义、在哪里调用,都属于window调用对吧?
差不多就是这样的,我现在还想不到什么特殊的,不符合的情况,
function的函数,它的实质就属于引用类型的一种形式。var a = function (){
console.log("a");
}b = a;
a(); //a
b(); //a
delete a;
//这个时候,a和b都指向的同一个函数引用。
a = function(){
console.log("b");
}//改变a的函数引用,但是b依然指向原来的函数
a(); //b
b(); //a//所以说,函数在被定义之后,就会一直存在,不管你是否引用。
恩,谢谢!
不过最后这个结论好像不是这样。尽管之前delete了a,但因有b还指向被定义的函数,所以delete只是删除了a对它的引用,没有删除函数本身。后面又使a指向了新的函数,这时a和b是指向两个不同的函数了。若前面把a,b都delete了,可能函数就会被gc回收了。