前端面试题(day1)

109 阅读2分钟

我的答案: 2 1 4 3 1 1

正确答案: 211233

错因

第三问: 在非严格模式下,声明变量的时候没有加var 和 let关键字,会默认将变量赋给全局作用域,在Foo函数中声明的getName函数没有加声明关键字,所以会赋值全局作用域,也就把之前声明的函数给覆盖了。 第四个function被第一个给赋值了,变量提升了。如果单独执行getName()的时候就是4,有执行过Foo()后就是1 第四问:构造器的私有属性getName, 打印2 第五问:new实例化一个对象,然后调用比对象的方法,如果在此对象上没有又找到,会往原型查找,可以分解成以下步骤 var newFoo = new Foo() newFoo.getName() 在newFoo里面找不到getName的方法,它就会去newFoo.prototype,也就会到找上面定义进去的Foo.prototype.getName,就打印3了 第六题同理

Foo函数原型 prototype 上面的方法 (getName) 可以通过 new 实例来调用 也可以通过直接访问prototype来调用。

考察点: const global this var的优先级,变量提升,函数提升,操作符优先级 this的指向问题是重点。

this的绑定规则有四种:默认绑定,隐式绑定,显式绑定,new绑定. 1.函数是否在 new 中调用(new绑定),如果是,那么 this 绑定的是新创建的对象。 2.函数是否通过 call,apply 调用,或者使用了 bind (即硬绑定),如果是,那么this绑定的就是指定的对象。 3.函数是否在某个上下文对象中调用(隐式绑定),如果是的话,this 绑定的是那个上下文对象。一般是 obj.foo() 4.如果以上都不是,那么使用默认绑定。如果在严格模式下,则绑定到 undefined,否则绑定到全局对象。 如果把 null 或者 undefined 作为 this 的绑定对象传入 call、apply 或者 bind, 这些值在调用时会被忽略,实际应用的是默认绑定规则。 箭头函数没有自己的 this, 它的this继承于上一层代码块的this