var person1 = function(name) {
this.name = name;
return function() {
alert(" 名字是 " + name)
}
};
var p = {name : "李四"};
person1().call(p);
输出为:
名字是 undefined
为什么?
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)();
等等,这个问题一直弄得不是太清。。
var person1 = function(name) {
this.name = name;
return function() {
alert(" 名字是 " + name)
}
};
这里已经完成了赋值,为什么要在:person1.call(p,p.name)();里传?
我的想法是:p 就是一个对象参数了,把p传入功能函数 person1();
为什么,好混。
person1.call(p,p.name)();
最后的括号理解了,它是对返回的函数的主动跳用;但是call();里面的参数怎么理解?
@殷敏峰:
var person1 = function(name){
alert(name);//打印undefined
//此处的this已经是你调用的p,this.name就是"李四"
alert(this.name);//打印"李四"
this.name = name;
……
}这个函数有个形参name,你在call时并没有传入该值,此时上面第一句打印出undefined。
@殷敏峰:
或者,你这样赋值,将this.name = name;改为:name=this.name;
@殷敏峰: 可查看js中call的用法,比如http://uule.iteye.com/blog/1158829。你都没了解call,咋用这么不好理解的逻辑来写代码呢?
@空山苦水禅人: 好吧,谢了!~
调用person1返回内部匿名函数--假如叫X,call(p)相当于调用对象p的X方法,而这个方法是没有参数的,name的值来自它的上下文,也就是person1的参数,也就是undefined
如果X有参数name,则优先使用这个参数
如果是this.name而不是name,则使用p的属性name,即李四
搞懂闭包就明白了
谢谢