|前端面试题--day01

text":"1.预编译分为作用域创建阶段以及预编译阶段
1.2预编译的时候做了哪些事情【|前端面试题--day01】例子:
function fn (a c) {
console.log(a)//function a(){
var a = 123
console.log(a)//123
console.log(c)//function c(){
function a () {
if (false) {
var d = 678

console.log(d)//undefined
console.log(b)//undefined
var b = function () { //表达式
console.log(b)//function(){
function c () {
console.log(c)//function c(){

fn(1 2)

  • 创建ao对象
    全称:active Object活动对象 , 保存函数调用时的局部变量 , 其实AO对象就是函数作用域对象
    AO:{
  • 找形参和变量声明 , 作为ao对象的属性名 值是undefined
    AO:{
    a:undefined
    c:undefined
    d:undefined
    b:undefined

  • 实参和形参相统一
    AO:{
    a:undefined -->1
    c:undefined -->2
    d:undefined
    b:undefined

  • 找函数声明(不是表达式如:a=function(){) , 会覆盖变量的声明
AO:{
a:undefined -->1 -->function a(){
c:undefined -->2 -->function c(){
d:undefined
b:undefined


  • 整个程序实际运行如下
    function fn (a c) {
    //第一步找形参和变量声明 , 作为ao对象的属性名 值是undefined
    var a;//undefined
    var d;//undefined
    var b;//undefined
    var c;//undefined
    //第二步实参和形参相统一
    a = 1
    c = 2
    //第三步找函数声明 , 会覆盖变量的声明
    a = function a () {
    c = function c () {
    //接下来就按原代码顺序执行
    console.log(a)//function a(){
    a = 123
    console.log(a)//123
    console.log(c)//function c(){
    function a () {
    if (false) {
    d = 678

    console.log(d)//undefined
    console.log(b)//undefined
    b = function () { //表达式
    console.log(b)//function(){
    function c () {
    console.log(c)//function c(){

    fn(1 2)
2.this指向
  • 全局作用域或者普通函数中this指向全局对象window 。 定时器里的this指向window
  • 对象中的方法谁调用this指向谁
  • 构造函数中this指向构造函数实例
var name = 222
var a = {
name: 111
say: function () {
console.log(this.name)


var fun = a.say
fun()//fun.call(window)===222
a.say()//a.say.call(a)===111
var b = {
name: 333
say: function (fun) {
fun()


b.say(a.say)//在b.say中调用a.say方法 , 此时fun()的调用者为window相当于fun.call(window)===222
b.say = a.say//b.say为function(){console.log(this.name)
b.say()//因为b.say的值已改变所以this指向为b相当于b.say.call(b)===333
2.1箭头函数中的this