下面是百度今年的一个笔试题:

杏花疏影里 2014-10-12 06:13:41
下面是百度今年的一个笔试题:

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("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}());
}
}
myObject.func();

结果是 bar bar undefined bar
关于第三个undefined我是这样理解的:func是myObject对象的属性方法,所以其内部this指向myObject对象本身。而此属性方法内部的匿名立即执行函数是独立的,其this指向自身的执行上下文,引用不到外部的foo,所以是undefined。但由于作用域链使用self可以通过self引用到外部,所以第四个是bar。

我是这样理解的,并且我做了个推论:

function outer(){
this.i = 10;
alert(this.i);
(function(){
alert(this.i);
}());
};
outer();

按道理第二次弹出对话框是undefined才对,可是它却是10!它这里怎么又能通过this引用外部的i了呢?why?

请大神不吝赐教!
...全文
516 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
张运领 2014-10-13
  • 打赏
  • 举报
回复
引用 11 楼 robertzsl 的回复:
谢谢!也就是说像 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

//所以说,函数在被定义之后,就会一直存在,不管你是否引用。
杏花疏影里 2014-10-13
  • 打赏
  • 举报
回复
引用 3 楼 zzgzzg00 的回复:
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();
谢谢!之前没有注意到这点。
杏花疏影里 2014-10-13
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
你没看到第二个 console.log("inner func: this.foo = " + this.foo); 是在内层中吗
恩,看到了,是之前不知道像这样的定义调用方法this也是指向window。
杏花疏影里 2014-10-13
  • 打赏
  • 举报
回复
引用 7 楼 zyl_lyr1019 的回复:
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=window
getName.call(obj); //ling   使用call强行把getName内部的this指向obj

obj.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

谢谢!也就是说像 function aa(){}这样定义、aa()这样调用的函数,不管在哪里定义、在哪里调用,都属于window调用对吧?
闪闪放光芒 2014-10-13
  • 打赏
  • 举报
回复
学习了@
杏花疏影里 2014-10-13
  • 打赏
  • 举报
回复
引用 17 楼 strSpecial 的回复:
这个题目考的是变量的作用域?
是的
杏花疏影里 2014-10-13
  • 打赏
  • 举报
回复
引用 16 楼 zyl_lyr1019 的回复:
貌似匿名函数就不会被回收,还有就是应用了闭包的函数,就算丢失了引用,也不会被回收。
哦,这块还没有注意过。
yangyang_cs 2014-10-13
  • 打赏
  • 举报
回复
你自己写的函数this指向是window!!!所以this.i就是window.i,在哪里都可以找到。 this是据以执行的对象,就是谁调用的,你写个函数,在window中调用,this自然指向window,百度面试题是使用对象调用,this指向对象~
张运领 2014-10-13
  • 打赏
  • 举报
回复
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=window
getName.call(obj); //ling   使用call强行把getName内部的this指向obj

obj.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

「已注销」 2014-10-13
  • 打赏
  • 举报
回复
function outer(){  
this.i = 10;  
alert(this.i);  
(function(){  
alert(this.i);  
}());  
};  
outer();  
你的这个调用的时候没new,没new的,都是this都是指向window,所以匿名函数里可以找到i。你new outer()就是undefined了、
strSpecial 2014-10-13
  • 打赏
  • 举报
回复
这个题目考的是变量的作用域?
KK3K2005 2014-10-13
  • 打赏
  • 举报
回复
a.b() 这个时候 b里面的this是 a( ‘里面’ 指顺序代码快 ) b.apply(a) b里面的this是a b.call(a) b里面的this是a b() 这个时候 b里面的this 是window 基本就这么个原则 在怎么变化也就是这样
张运领 2014-10-13
  • 打赏
  • 举报
回复
额~~~竟然把delete带上了,这个不是要在这里说的,我当时想到了其他的东西,就拿来delete测试了一下,跟你这里的问题,无关的~~~ 函数是否会被回收,这个我也不太确定 貌似匿名函数就不会被回收,还有就是应用了闭包的函数,就算丢失了引用,也不会被回收。
杏花疏影里 2014-10-13
  • 打赏
  • 举报
回复
引用 14 楼 zyl_lyr1019 的回复:
//所以说,函数在被定义之后,就会一直存在,不管你是否引用。
恩,谢谢! 不过最后这个结论好像不是这样。尽管之前delete了a,但因有b还指向被定义的函数,所以delete只是删除了a对它的引用,没有删除函数本身。后面又使a指向了新的函数,这时a和b是指向两个不同的函数了。若前面把a,b都delete了,可能函数就会被gc回收了。
zhjdg 2014-10-12
  • 打赏
  • 举报
回复
理所当然的, 没人要的东西都属于top(这里是window).
似梦飞花 2014-10-12
  • 打赏
  • 举报
回复
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();
会飞的Pikachu 2014-10-12
  • 打赏
  • 举报
回复
第三个是一个自执行函数,在内层中没有foo的定义啊
xuzuning 2014-10-12
  • 打赏
  • 举报
回复
你没看到第二个 console.log("inner func: this.foo = " + this.foo); 是在内层中吗

87,991

社区成员

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

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