Skip to content

下面代码的输出是什么?

js
var name = '123';

var obj = {
 name: '456',
 print: function() {
  function a() {
    console.log(this.name);
  }
  a();
 }
}

obj.print();

参考答案:

上述代码输出结果为 "123"。解释如下:

  1. 在全局作用域中声明了变量 name,值为字符串 "123"。
  2. 声明一个对象 obj,包含属性 name 和方法 print,其中 name 属性的值为字符串 "456",print 方法中定义了函数 a。
  3. 当执行 obj.print() 时,会调用 print 方法,并在其中定义了函数 a。
  4. 函数 a 中调用 console.log(this.name) 方法。由于此时 this 指向全局对象(即 window 对象),因此执行 this.name 等价于执行 window.name。
  5. 根据步骤1,window.name 的值为字符串 "123",因此最终输出结果为 "123"。

需要注意的是,在JavaScript中,this 的值取决于函数在何处被调用。如果该函数是作为对象的方法进行调用的,则 this 指向该对象;否则,this 指向全局对象。在本例中,虽然函数 a 被定义在 print 方法中,但是它并没有作为 obj 的方法进行调用,因此 this 指向全局对象。

题目要点:

在JavaScript中,this指向通常是初中级前端面试的常考题目,这类题的变形点很多,但是大家只要抓住最本质的东西,就能轻松拿捏。

只记住一条:JavaScript中,函数中的this指向,只和函数调用时所属的对象有关系。如果函数调用时前面没有任何对象,那么this就指向全局的(window或者global);如果函数调用时前面有对象,比如 obj.foo() ,那么这时候 this就指向的是 obj这个对象。当然也有特例,我们可以使用 箭头函数 或者 bind() ,在函数创建时就显示绑定了 this,这种情况就要分析 函数创建时 绑定的 this是谁了