如下代码片段的运行结果是
var obj ={a:1,b:function () {alert(this.a)}}; var fun =obj.b; fun();
this的行为有时候会显得极其诡异,让人感到困惑,但只需要记住 this的值要等到代码真正执行时才能确定
同时this的值具体有以下几种情况:
new 调用时指的是被构造的对象
call、apply调用,指向我们指定的对象
对象调用,如执行obj.b(),this指向obj
默认的,指向全局变量window(相当于执行window.fun())
这样看来,当你执行fun()的时候,以上1,2点均不满足。
第3点,因为this是运行时确定的,而我们执行fun(),等同于windown.fun()(与obj没有任何关系),自然的this指向window,而window没有定义变量a,结果是undefined。
这段代码会在控制台中打印出 undefined。 原因是 fun 是 obj.b 的引用,但是当你调用 fun() 时,它已经脱离了 obj 对象的上下文。 在 JavaScript 中,函数的 this 关键字是在函数被调用时确定的,而不是在函数被定义或者被赋值时确定。 因此,当你调用 fun() 时,this 实际上指向的是全局对象(在浏览器中是 window),而不是 obj。 由于全局对象没有属性 a,所以 this.a 的值为 undefined。 如果希望 this 指向 obj,你可以使用函数的 call、apply 或者 bind 方法来指定函数运行时的上下文。例如: var obj ={a:1,b:function () {alert(this.a)}}; var fun =obj.b; fun.call(obj); 这段代码会弹出一个警告框,显示数字 1。因为我们使用了 call 方法来调用 fun,并将 obj 作为参数传入,这样就把函数的上下文设置为了 obj。
答案:C
虽然fun是obj.b的一个引用,但是实际上,它引用的是b函数本身,因此此时的fun()其实 是一个不带任何修饰的函数调用,所以this指向window。