有关前端js中this指向的问题笔记

前言

在以往的ECMAScript 5中,this的指向可谓是多种多样,在各个公司面试题也是必考项,现收集几个面试题进行解析:

原题解析

题1:

var o = {
  fn: function(){
    var a = 1;
    console.log(this.a);
  }
}
o.a = 2;
o.fn.a = 3;
o.fn();

*分析:

o.a = 2; // 赋值, 即给对象o添加一个a属性,值为2
o.fn.a = 3; // 赋值, fn函数添加属性 a 为 3
o.fn(); // 对象调用,this是函数对象o里面

答案:2

题2:

var o = {
function fun(){
  var a = 1;
  this.a = 2;
  function fn(){
    return this.a;
  }
  fn.a = 3;
  return fn;
}
var result = fun()();
console.log(result)

*分析:

  var a = 1; // 全局变量
  this.a = 2; // 全局添加属性
  var result = fun()(); // 函数直接调用,this window对象

答案:2

题3:

var a = 1;
var obj = {
  a: 2,
  fn: (function(){
    this.a = 3;
    return function(){
      return this.a;
    }
  })()
}
var fn = obj.fn;
var result1 = obj.fn();
var result2 = fn();
console.log('result1: ', result1);
console.log('result2: ', result2);

*分析:

  补充知识点:
  // 自运行函数是先执行的;比如
  var o ={
    a: 1+1  // 先执行 1 + 1;
  }
  this.a = 3; // 全局变量
  var result1 = obj.fn(); // obj对象调用,指向对象内部 a值
  var result2 = fn(); // global调用a, 值为3

答案:2, 3

题4:

var arr = [fn1,fn2];
function fn1(){
  return this.length;
}
function fn2(){
  return this[0];
}
var a = arr[0]();
var b = arr[1]()();
console.log('a: ', a);
console.log('b: ', b);

*分析:

  // 枚举
  return this.length; // this是数组
  var b = arr[1]()(); // global调用
   // 在浏览器中与在弄的环境中运行结果都不一样
  //  node:
  //  a: 2;
  //  b: undefined;

答案:2, undefined;

题5:

function f(){
  console.log(this.a)
};
f.a = 100;
怎么使函数中打印100

*分析:

  // 方法一 call 方法
  f.call(f);
  // 方法二  arguments.callee
  原函数更改为:
  function f(){
    console.log(arguments.callee.a)
  }
  f.a = 100;
  f();

答案:f.call(f), console.log(arguments.callee.a);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值