前端面试题讲解(THIS、构造函数、面向对象、堆栈内存以及闭包)

该博客详细讲解了JavaScript中的关键概念,包括严格模式、ARG映射机制、逻辑运算符、堆栈内存释放、构造函数、原型链、闭包以及this的使用。通过实例解析了事件绑定、原型重定向问题,并探讨了团队协作中如何避免函数重名。还介绍了面向对象和数组去重方法,强调了闭包在保护变量和实现模块化开发中的重要作用。
摘要由CSDN通过智能技术生成

视频地址:https://www.bilibili.com/video/av24383268/?p=13

02. JS中的严格模式和ARG映射机制

EXP1

if(!("a" in window)){
    // !true
    var a = 1;
}
console.log(a);

输出:undefined

不管条件是否成立都要进行变量提升,在全局作用域下声明的变量,也相当于给window设置了一个对象的属性,而且两者之间建立了映射机制 <=> window.a = undefined

in:检测某一个属性是否隶属于这个对象,不管是私有属性还是公有属性,只要有这个属性结果就是true

hasOwnProperty:检测某一个属性是否为对象的私有属性(只有这个属性是私有的才可以)

EXP2

var a = 4;
function b(x, y, a){
   
    console.log(a);
    arguments[2] = 10;
    console.log(a);
}
a = b(1,2,3); // a = undefined
console.log(a)

输出:3 10 undefined

arguments:函数内置的实参集合,不管是否设置形参,传递的实参值都在这个集合中,结构如下:

arguments: {
   
    0: 1,
    1: 2,
    2: 3,
    length: 3,
    callee: // 函数本身
}

在非严格模式下,函数中的形参变量存在映射机制(相互之间存在影响),改变形参arguments的值会改变,改变arguments形参中对应的参数会改变

映射机制

function fn(x, y){
   
    var arg = arguments;
    arg[0] = 2;
    console.log(x); // => 2
    y = 1;
    console.log(arg[1]) // => undefined
}

fn(10)

ARG和形参之间的映射是以ARG的索引为基础完成的,ARG中有这个索引,浏览器会完成和对应形参变量中的映射机制搭建,如果形参比ARG中的个数多,那么多出来的形成那是无法和ARG中的索引建立关联的。

arguments的映射机制,是依赖于索引而进行的

function fn(x, y){
   
    var arg = arguments;
    arg[0] = 2;
    console.log(x); // => 2
    arg[1] = 1;
    console.log(y) // => undefined
    y = 400;
    console.log(arg[1]);
}

fn(10)

arguments和形参的映射机制是建立在函数执行后形参赋值的一瞬,此时能建立映射机制的建立映射机制,不能建立起来的,以后不管怎么操作都无法建立了

严格模式

在当前作用域的第一行添加 "use strict" 即可,这样在当前作用域中就开启了严格模式

  1. 在严格模式下不支持使用 arguments.callee / arguments.callee.caller
  2. 在严格模式下 arguments 和形参没有映射机制
  3. 不允许一个对象下有两个相同的属性名(非严格模式下,后设置的属性会覆盖前一个属性)
  4. 在严格模式下,函数执行,如果没有明确指定执行的主体(函数前面没有.),不再像严格模式下,统一交给 window,而是让 this 指向 undefined

03. 逻辑或和逻辑与

EXP1

var foo = 'hello';
(function(foo){
   
    /*
        形参赋值:foo = 'hello'
        变量提升:var foo; 这一步省略:因为在私有作用于中已经有foo这个变量了,浏览器不会重新声明重复的变量
    */
    console.log(foo);
    var foo = foo || 'world';
    console.log(foo) // => 'hello'
})(foo); // 把全局下的foo的值作为实参传递给函数的形参 => "hello"
console.log(foo); // => 'undefined'

结果: ‘hello’ ‘undefined’

逻辑或和逻辑与

  1. 或赋值

    var a 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值