9行js代码,难倒程序员无数!

reniM 发布于 2013/01/21 14:00
阅读 1K+
收藏 12

问题来了,执行结果是什么?

为什么是这个结果啊?

虐心啊 有没有?

var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : function(){
            alert(this.name)
     function a(){
        return this.name;
     };
        return a;
    }
};
alert(object.getNameFunc()());

加载中
0
心_行
心_行
"My Object"?
0
修改登录密码
修改登录密码
两次 alert("my object")?
 

                    
0
子木007
子木007

貌似:

my object

the window

0
修改登录密码
修改登录密码
两次 alert("my object")?
 

                    
0
雪之舞
这个算是很基本的吧
0
winziyuan
winziyuan
经典的回答:执行一下就知道了!!!!
0
王振威
王振威
就是对闭包的理解啦~
0
Narky
Narky

作用域问题吧

对于function a 的是找不到object作为他的this的,所以只能用全局的this

0
呆瓜
呆瓜
My Object
The window
JS的方法中的this指向,默认是谁调用指向谁,
object.getNameFunc()

getNameFunc是通过object来调用的,所以getNameFunc中的this指向object,this.name就是object.name。

object.getNameFunc()()
相当于
var a = object.getNameFunc();  a();
调用a的时候没有调用者,则默认是window,那么this.name就是window.name;

在js中,我们可以通过call和apply方法来指定调用的方法中的this指向,比如

object.getNameFunc().call(object); 
相当于
var a = object.getNameFunc();
a.call(object);

执行结果是 My Object , My Object。 a.call(object),表示调用a方法,将a中的this指向object,所以a.call(object)执行中的this.name 就是object.name;
相应的 a.apply(object); 一样。

call和apply的区别在于,如果a有参数的话,比如:


function method(arg1, arg2){
    alert(this.name + "-" + args + "-" + arg2);
}
//正常调用
method(1,2); //打印 undefined-1-2
//call调用
var thisOwner = {
    name :  "hello"
}
method.call(thisOwner, 1, 2); //打印 hello-1-2
//apply调用
method.apply(thisOwner, [1,2]); //打印hello-1-2
apply和call的区别在于一个参数用数组或者arguments,一个不是数组

另外:
this不存在闭包,永远是谁调用指向谁,没有调用者,指向window


0
zfc827
zfc827

第一个是 My Object,原因就不解释了。第二个值是 The Window 解释一下:

JavaScript 每次调用时,会为他创建一个调用对象放置到作用域链中。

object.getNameFunc()() 等价于 function a(){ return this.name;}();

由于是在 object 闭包外面调用,因此 this.name 引用的并不是 object 中定义的。而是与之同一上下文的定义。

返回顶部
顶部