【 字节面试辅导 - 考核运行机制 - js】

328 阅读1分钟

极限物联网工作室前端字节面试辅导

this 和 作用域

考题1

function fn() {
  return this.length + 1;
}
var length = 10;
var obj = {
  length: 5,
  test1: function () {
    return fn();
  },
};
obj.test2 = fn;
//字节经典题,下面代码输出是什么
console.log(obj.test1());
// obj.test1() => fn() => window.fn() => window.length + 1 => 10 + 1
console.log(fn() === obj.test2());
// fn() => window.fn() => window.length + 1 => 10 + 1
// obj.test2() => obj.fn() => obj.length + 1 => 5 + 1

题目2

function fun(n, o) {
  console.log(o);
  return {
    fun: function (m) {
      return fun(m, n);
    },
  };
}
​
var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
​
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1);
c.fun(2);
c.fun(3);
​
// undefined 0 0 0
// undefined 0 1 2
// undefined 0 1 1

题目3

let a = 1;
const function1 = function () {
  console.log(a);
  a = 2;
};
a = 3;
const function2 = function () {
  console.log(a);
};
function1();
function2();

题目4

var a = {
  b: function () {
    console.log(this);
  },
};
var c = a.b;
c();

题目5

let inner = 'Window';

function say() {
  console.log(inner);
  console.log(this.inner);
}

var obj1 = (function () {
  var inner = '1-1';
  return {
    inner: '1-2',
    say: function () {
      console.log(inner);
      console.log(this.inner);
    },
  };
})();

var obj2 = (function () {
  var inner = '2-1';
  return {
    inner: '2-2',
    say: function () {
      console.log(inner);
      console.log(this.inner);
    },
  };
})();

say(); // Window undefined
obj1.say(); // 1-1 1-2
obj2.say(); // 2-1 2-2
obj1.say = say;
obj1.say(); // Window 1-2
obj1.say = obj2.say;
obj1.say(); // 2-1 1-2

eventloop

题目1

console.log('1'); // 1setTimeout(function () {
  console.log('2'); // 5
  process.nextTick(function () {
    console.log('3'); // 7
  });
  new Promise(function (resolve) {
    console.log('4'); // 6
    resolve();
  }).then(function () {
    console.log('5'); // 8
  });
});
​
process.nextTick(function () {
  console.log('6'); // 3
});
​
new Promise(function (resolve) {
  console.log('7'); // 2
  resolve();
}).then(function () {
  console.log('8'); // 4
});
​
setTimeout(function () {
  console.log('9'); // 9
  process.nextTick(function () {
    console.log('10'); // 11
  });
  new Promise(function (resolve) {
    console.log('11'); // 10
    resolve();
  }).then(function () {
    console.log('12'); // 12
  });
});

题目2

async function async1() {
  console.log('async1 start'); // 2
  await async2();
  console.log('async1 end'); // 6
}
​
async function async2() {
  console.log('async2'); // 3
}
​
console.log('script start'); // 1setTimeout(function () {
  console.log('setTimeOut'); // 8
}, 0);
​
async1();
​
new Promise(function (resolve) {
  console.log('promise1'); // 4
  resolve();
}).then(function () {
  console.log('promise2'); // 7
});
​
console.log('script end'); // 5

题目3

function app() {
  setTimeout(() => {
    console.log("1-1");
    Promise.resolve().then(() => {
      console.log("2-1");
    });
  });
  console.log("1-2");
  Promise.resolve().then(() => {
    console.log("1-3");
    setTimeout(() => {
      console.log("3-1");
    });
  });
}
app();
/*
1-2
1-3
1-1
2-1
3-1
*/
​
​
Promise.resolve()
  .then((res) => {
    setTimeout(() => {
      return 3
    }, 0);
    return 4;
  })
  .then((data) => {
    console.log(data);
    console.log(222);
  });

setTimeout

// for (var i = 0; i < 5; i++) {
//   (function (i) {
//     setTimeout(function () {
//       console.log(i);
//     }, 1000 * i);
//   })(i);
// }// for (let i = 0; i < 5; i++) {
//   setTimeout(function () {
//     console.log(i);
//   }, 1000 * i);
// }for (var i = 0; i < 5; i++) {
  setTimeout(
    function (i) {
      console.log(i);
    },
    1000 * i,
    i
  );
}