首页 > 试题广场 >

下面这段JavaScript代码的的输出是什么?

[单选题]
下面这段JavaScript代码的的输出是什么?
var myObject = {
    foo: "bar",
    func: function() {
        var self = this;
        console.log(this.foo);   
        console.log(self.foo);   
        (function() {
            console.log(this.foo);   
            console.log(self.foo);   
        }());
    }
};
myObject.func();


  • bar
    bar
    bar
    bar
  • bar
    bar
    bar
    undefined
  • bar
    bar
    undefined
    bar
  • undefined
    bar
    undefined
    bar
推荐
1.第一个this.foo输出bar,因为当前this指向对象myObject
2.第二个self.foo输出bar,因为self是this的副本,同指向myObject对象。
3.第三个this.foo输出undefined,因为这个IIFE(立即执行函数表达式)中的this指向window。
4.第四个self.foo输出bar,因为这个匿名函数所处的上下文中没有self,所以通过作用域链向上查找,从包含它的父函数中找到了指向myObject对象的self。
编辑于 2015-01-02 10:52:20 回复(12)
func : self == this  is true
(function(){});  self != this..
发表于 2015-01-08 15:27:19 回复(0)
 (function() {
            console.log(this.foo);  
            console.log(self.foo);  
        }());
这个里面因为是闭包。所以this.fooshi undefined 的

发表于 2015-03-31 11:12:35 回复(1)
C
发表于 2015-01-07 14:09:53 回复(0)
C
发表于 2014-12-31 10:17:34 回复(0)
依次输出  bar  bar  undefined bar

理解关键:方法/函数是由谁(对象) 调用 的,方法/函数内部的 this 就指向谁(该对象);

注意:被谁调用,不是处于谁的作用域,即使在作用域

1、func是由myObject调用的,this指向 myObject。
2、self指向myObject,相当于 myObject的this的副本。
3、这个立即执行匿名函数表达式(IIFE)是由window调用的,this指向 window 。
4、IIFE的作用域处于myObject.func的作用域中,本作用域找不到self变量,沿着作用域链向上查找self变量,找到了指向 myObject对象的 self。
发表于 2015-01-06 22:21:50 回复(3)
考察的是匿名函数具有全局作用域.
发表于 2016-10-30 20:15:23 回复(7)
详见javascript高级程序设计第三版182页,一模一样的例子——匿名函数的执行环境具有全局性,因此其this对象通常指向window(使用call或apply除外)。
发表于 2016-10-22 20:18:32 回复(0)
1.this总是指向调用它的那个对象,如果是立即执行函数或者setTimeOut()这样的全局(window)函数则this指向的是window对象即this为全局的this.x中的x为全局变量
2.js的作用域链,如果本作用域着不到对象就向上一层找
发表于 2016-09-11 00:32:25 回复(0)
C.bar bar undefined bar

那个IIFE块级作用域改变了作用域变成全局
this指向了window,所以找不到变量;
而self是复制了this指针,所以还能找到变量值
发表于 2014-12-30 17:37:46 回复(0)
一般来说匿名函数和setTimeOut函数具有全局性,他们的this和self都是指window对象
发表于 2017-02-23 22:00:41 回复(0)
1.在func函数中,this代表myObject这个对象,
那么第一个打印就是打印myObject.foo,结果是 bar;
2.var self = this,那么第二个打印就相当于this,结果是bar;
3.在对象的函数内的匿名函数,其this代表当前的函数,那么foo在函数func中未定义,所以结果是undefined;
4.self指向的依然是对象,结果是bar
so.答案就是C

发表于 2014-12-31 10:51:44 回复(1)
第一个this指向MyObject,所以会输出bar
第二个把this赋值给了self,所以会输出bar
第三个是立即执行函数 IIFE中的this指向window
第四个没有指向window是因为IIFE中没有self所以会向上查找输出bar
这题做错了 看了评论才想起来 IIFE中的this指向window
发表于 2021-11-25 11:10:36 回复(0)
这题是考察this的指向。

首先调用时myObject.func() 因此调用时func 内部的this会指向myObject。所以前两个都输出bar.
然后在一个立即表达式中执行,相当于this指向了window,而window上是没有foo这个属性的所以输出undefined.
最后self是保存了之前this的指向,仍然指向myObject因此仍会输出bar.
发表于 2021-03-22 12:05:01 回复(0)

第一个,找myobject中的属性值

第二个,是复制得到的属性值,与第一个相同,

第三个,立即执行函数,this指向window,

第四个为一般的变量,顺着原型链往上寻找。

发表于 2020-02-16 22:03:10 回复(0)
C,闭包上下文是闭包本身,其本身的活动量并不存在foo。
发表于 2015-02-28 09:39:28 回复(0)
立即执行函数不是应该先被执行吗,不应该是:undefined bar bar bar 吗
发表于 2020-11-23 09:28:45 回复(0)
改成这样答案就是A了……
var myObject = {
    foo: "bar",
    func: function() {
        var self = this;
        console.log(this.foo);  
        console.log(self.foo);  
        (function() {
            console.log(this.myObject.foo);  
            console.log(self.foo);  
        }());
    }
};
myObject.func();

发表于 2019-04-28 09:13:36 回复(0)
立即执行匿名函数表达式(IIFE)是由window调用的,this指向 window 。
发表于 2018-07-31 22:40:08 回复(0)
ps:
①this对象是在运行时基于函数的运行环境绑定的:在全局函数中,this = window,而当函数被作为某个对象的方法调用时,this = 那个对象。
②第一个和第二个输出是myObject在调用这个函数
第三个和第四个是在闭包(闭包的常见形式--在一个函数内部创建闭包)里面,这个闭包是一个自执行函数。可以理解未,最终调用的是windows。
发表于 2017-03-25 00:01:19 回复(0)
自动执行函数里面的变量都属于私有变量,外部访问需要加window转换,所以this为null,当this为null时this转换为全局对象,所以undefined
发表于 2019-05-12 11:18:07 回复(0)