首页 新闻 会员 周边

JavaScript的一个小小疑问

0
[已解决问题] 解决于 2015-06-01 11:36

var person1 = function(name) {

this.name = name;

return function() {

   alert(" 名字是 " + name)

  }

};

var p = {name : "李四"};

person1().call(p);

 

输出为:

名字是 undefined

 

为什么?

Coca-code的主页 Coca-code | 初学一级 | 园豆:10
提问于:2015-05-29 15:20
< >
分享
最佳答案
0

person1().call(p);应该是person1.call(p);表示p来调用person1函数,而你的person1返回一个函数,还需要主动调用,也就是:person1.call(p)();但是这个时候在person1里面你是没有传参数name进去的,你需要在call函数里面传入,如下:

var person1 = function(name) {
return function() {
  alert(" 名字是 " + name)
}
};
var p = {name : "李四"};
person1.call(p,p.name)();

奖励园豆:5
空山苦水禅人 | 菜鸟二级 |园豆:207 | 2015-05-29 15:42

等等,这个问题一直弄得不是太清。。

var person1 = function(name) {

this.name = name;

return function() {

   alert(" 名字是 " + name)

  }

};

这里已经完成了赋值,为什么要在:person1.call(p,p.name)();里传?

我的想法是:p 就是一个对象参数了,把p传入功能函数 person1();

为什么,好混。

Coca-code | 园豆:10 (初学一级) | 2015-05-29 15:54

person1.call(p,p.name)();

最后的括号理解了,它是对返回的函数的主动跳用;但是call();里面的参数怎么理解?

Coca-code | 园豆:10 (初学一级) | 2015-05-29 16:01

@殷敏峰: 

var person1 = function(name){

alert(name);//打印undefined

//此处的this已经是你调用的p,this.name就是"李四"

alert(this.name);//打印"李四"

this.name = name;

……

}这个函数有个形参name,你在call时并没有传入该值,此时上面第一句打印出undefined

空山苦水禅人 | 园豆:207 (菜鸟二级) | 2015-05-29 16:03

@殷敏峰: 

或者,你这样赋值,将this.name = name;改为:name=this.name;

空山苦水禅人 | 园豆:207 (菜鸟二级) | 2015-05-29 16:05

@殷敏峰: 可查看js中call的用法,比如http://uule.iteye.com/blog/1158829。你都没了解call,咋用这么不好理解的逻辑来写代码呢?

空山苦水禅人 | 园豆:207 (菜鸟二级) | 2015-05-29 16:10

@空山苦水禅人: 好吧,谢了!~

Coca-code | 园豆:10 (初学一级) | 2015-05-29 16:20
其他回答(1)
0

调用person1返回内部匿名函数--假如叫X,call(p)相当于调用对象p的X方法,而这个方法是没有参数的,name的值来自它的上下文,也就是person1的参数,也就是undefined

如果X有参数name,则优先使用这个参数

如果是this.name而不是name,则使用p的属性name,即李四

搞懂闭包就明白了

Uteki | 园豆:573 (小虾三级) | 2015-05-29 15:49

谢谢

支持(0) 反对(0) Coca-code | 园豆:10 (初学一级) | 2015-06-01 11:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册