首页 > 试题广场 >

如下代码片段的运行结果是

[单选题]
如下代码片段的运行结果是
var obj ={a:1,b:function () {alert(this.a)}}; 
var fun =obj.b; 
fun();

  • 弹出a
  • 弹出1
  • 弹出undefined
  • 什么也看不到
推荐
var b = function(){
    alert(this.a); 
},
obj = {
    a:1,
    b:b // 把函数独立出来 
};
var fun = obj.b;// 存储的是内存中的地址
fun();

答案:C

虽然fun是obj.b的一个引用,但是实际上,它引用的是b函数本身,因此此时的fun()其实 是一个不带任何修饰的函数调用,所以this指向window。

编辑于 2017-03-19 19:46:37 回复(8)
我咋咋感觉是报错呢,window上没有a这个属性,也没有声明,不应该报错吗

发表于 2018-10-10 18:54:41 回复(2)
this指向window对象,找不到a,这个时候a应该是未申明吧,为什么都是未定义?(访问一个不存在的属性会保undefined,未申明的变量才是typeerror)所以在这里是为了访问window对象下的a属性,虽说这也是访问全局变量。
发表于 2018-01-19 11:18:11 回复(1)
全局中的函数this指向window
发表于 2021-08-29 19:30:13 回复(0)

this的行为有时候会显得极其诡异,让人感到困惑,但只需要记住 this的值要等到代码真正执行时才能确定
同时this的值具体有以下几种情况:

  1. new 调用时指的是被构造的对象

  2. call、apply调用,指向我们指定的对象

  3. 对象调用,如执行obj.b(),this指向obj

  4. 默认的,指向全局变量window(相当于执行window.fun())

这样看来,当你执行fun()的时候,以上1,2点均不满足。
第3点,因为this是运行时确定的,而我们执行fun(),等同于windown.fun()(与obj没有任何关系),自然的this指向window,而window没有定义变量a,结果是undefined。

发表于 2017-08-27 14:05:42 回复(8)
执行b,a变量在此function中未定义
发表于 2016-12-24 18:57:51 回复(0)
var fun = obj.b;    //相当于var fun = function(){alert(this.a)};
fun();    //没有谁来调用的时候,this自然指向window
//而window里面没有定义a,所以弹出undefined

发表于 2018-03-13 19:53:10 回复(3)
一句话:当前的方法属于谁,this 就是谁。
fun()  属于window,所以 this 指向 window。
发表于 2018-08-23 15:49:24 回复(1)
当前this指向window,可将代码改为var obj ={ a : 1 , b : function () { alert ( this . a )}} ; var fun =obj. b ; fun. call (obj) 此时结果为1
发表于 2017-04-18 14:40:19 回复(0)
回调函数的this指向为window,因为window里并没有a属性,因此显示undefined。
注:如果a是一个变量则报错,属性没有不会报错.只会显示undefined
发表于 2018-09-06 19:27:31 回复(0)
fun()  是指在全局环境运行 ,那么函数里的this指向调用的对象,也就是window,我是这么理解的。
发表于 2017-03-12 21:12:54 回复(0)
答案:C
解析:this的值存在的情况:
  • 函数调用
    • 默认地,指向全局变量window(严格模式下指向undefined)
    • apply、call:apply、call调用时,指向传入的第一个参数
    • bind:调用f.bind(someObject)会创建一个与f具有相同函数体和作用域的函数
    • 箭头函数:没有this。this与封闭词法环境的this保持一致。
  • 作为对象的方法
    • 默认地,指向调用对象。如执行obj.b(),this指向obj
    • 类中的this:取决于如何被调用。如果要让类中的 this 值总是指向这个类实例,可在构造函数中绑定类方法
  • 作为构造函数:指向实例对象。如果手动地设置了返回对象,与this绑定的默认对象就会被丢弃。
  • 事件处理
    • 作为一个DOM事件处理函数:指向触发事件的元素(一些浏览器在使用非addEventListener的函数动态地监听函数时不遵守这个规定)
    • 作为一个内联事件处理函数:指向监听器所在的DOM元素
发表于 2021-12-09 17:13:25 回复(0)
this的指向在js中会随不同情况的确定而确定:
this的指向是当我们调用(执行)函数的时候确定的,调用的方式不同决定了this的指向不同
1.普通函数调用的时候this指向的是window
2.构造函数调用的时候this指向的是实例对象,原型对象里面的方法的this也是指向实例对象(这里结合原型链理解)
3.对象方法调用的时候this指向的就是该方法所属的对象
***绑定方法的时候this指向的是绑定时间的对象,比如说鼠标滑过、点击等
5.定时器函数中this指向的是window
6.立即执行函数(自调用函数)中this指向的是window

在本题中相当与var fun = function () {alert(this.a)}
(因为obj.a是一个函数,是一个引用类型,所以obj.a保存的是函数的地址,所以fun中保存的是函数的引用地址)
fun()的时候执行函数,由于普通函数执行的时候this指向的是window,所以此题this指向的就是window,又window中没有a,所以会弹出undefined


编辑于 2019-11-23 22:24:30 回复(0)
没有××.fun()而是直接fun(),那么默认为Window.fun(),Window没有a这个属性所以选C
发表于 2018-11-01 18:39:42 回复(0)
此时代码中的this指向obj,而定义好的obj中没有定义a属性,所以是undefined
this的指向总共有4中情况:
1,new调用时指向被构造的函数
2,call、apply指向我们指定的对象
3,对象调用,如obj.b()
4,默认this,即:window
发表于 2018-07-02 18:02:28 回复(0)
这里的函数作为普通函数调用,产生的this对象为window,那么alert(this.a)即为window.a是没有定义的,结果就是undefined
发表于 2017-07-26 22:16:12 回复(0)
c this指window
编辑于 2016-11-28 14:37:37 回复(0)
this指向问题,调用fun()调用时候this指向window   此时window中没有定义a   所以报undefined
发表于 2021-06-02 16:29:10 回复(0)
这段代码会在控制台中打印出 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。

发表于 2023-10-09 10:57:17 回复(0)
obj和this这个是同级的,所以this是指向Windows
发表于 2022-04-28 17:35:44 回复(0)
这里应该是考"this的隐式丢失"
发表于 2021-04-03 11:09:41 回复(0)