(一) 如何正确的判断 this? 箭头函数的 this 是什么?*
this 的绑定规则有四种:默认绑定,隐式绑定,显式绑定,new 绑定.
1.函数是否在 new 中调用 (new 绑定),如果是,那么 this 绑定的是新创建的对象;
2.函数是否通过 call,apply 调用,或者使用了 bind (即硬绑定),如果是,那么 this 绑定的就是指定的对象;
3.函数是否在某个上下文对象中调用 (隐式绑定),如果是的话,this 绑定的是那个上下文对象。一般是 obj.foo();
4.如果以上都不是,那么使用默认绑定。如果在严格模式下,则绑定到 undefined,否则绑定到全局对象;
5.如果把 null 或者 undefined 作为 this 的绑定对象传入 call、apply 或者 bind, 这些值在调用时会被忽略,实际应用的是默认绑定规则;
箭头函数没有自己的 this, 它的 this 继承于上一层代码块的 this。
(二) 词法作用域和 this 的区别
1.词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的;
2.this 是在调用时被绑定的,this 指向什么,完全取决于函数的调用位置 (关于 this 的指向问题,本文已经有说明)。
(三) 什么是闭包?闭包的作用是什么?闭包有哪些使用场景?
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包最常用的方式就是在一个函数内部创建另一个函数。
闭包的作用有:
1. 封装私有变量;
2. 模仿块级作用域 (ES5 中没有块级作用域);
3. 实现 JS 的模块。
(四) 谈谈你对原型的理解?
在 JavaScript 中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。其中每个函数对象都有一个 prototype 属性,这个属性指向函数的原型对象。使用原型对象的好处是所有对象实例共享它所包含的属性和方法。
网友评论