最近一直在面试 遇到挺多问题,部分理解但在面试官那里总是描述不清楚 以至于多次被委婉拒绝 在这里问几个答的不太好的问题.....
什么是作用域链、原型链?
描述下执行上下文?
函数、变量在编译阶段做了哪些工作?
原型应用场景?以及为什么要使用原型?
最近一直在面试 遇到挺多问题,部分理解但在面试官那里总是描述不清楚 以至于多次被委婉拒绝 在这里问几个答的不太好的问题.....
什么是作用域链、原型链?
描述下执行上下文?
函数、变量在编译阶段做了哪些工作?
原型应用场景?以及为什么要使用原型?
小弟的一些理解,求各位大神不吝赐教
1、作用域:js是基于词法作用域的语言,js作用域是指在作用域内声明的所有变量始终是可见的。作用域链:在js中函数也是对象,内部拥有内置、供浏览器js引擎存取的属性。其中内部属性[[scope]]包含了一个函数被创建的作用域中对象的集合,这个集合就是作用域链。
2、原型链:js对象在创建时均会有一个内部属性__proto__。这个属性相当于一个指针指向该对象的原型。__proto__属性在个别浏览器还未可见(具体我也不知道哪些=.=)。而原型是js中的普通对象,换句话说就是原型内部也有一个指针指向原型。依次组成原型链。值得注意的是构造函数的原型是在函数的内部属性prototype中 。js对象基于原型,原型在js中可实现对象属性、方法的继承。应用场景:构造函数、调用js对象中的方法时会运用到,比如var arr=[1,2,3,5]; arr.push('4');在arr中没有push()方法,所以会根据__proto__的指向也就是原型链向上查找push()方法。直到Array对象,才找到该方法。
3、执行上下文:又可称作执行环境。一般理解为函数的执行环境。执行环境在函数执行时创建,执行完毕后被销毁,可见每次函数执行时对应的执行环境是独一无二的。每次执行创建的执行环境都有自己的作用域链,此时作用域链是用于解析标识符。函数执行时作用域链会被初始化为当前[[scope]]属性中的对象。这些值会按照他们出现在函数中的顺序复制到作用域链中。作用域链初始化完成后会创建一个“活动对象”,活动对象包含了所有的局部变量、命名参数、形参集合、this,然后“活动对象”被推入作用域链的最前端。当执行环境销毁则活动对象也会跟着销毁。
4、函数、变量:变量会比函数先声明。变量在预编译阶段会被赋予undefined,在执行时执行赋值语句。而函数在编译时会直接处理函数体体,完成函数创建。
8 回答4.7k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
6 回答2.3k 阅读
5 回答6.3k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
尝试回答一下
1.作用域链
js只有一种作用域,函数,所以作用域链简单而言,就是一层层函数的嵌套,同时内函数可以访问外函数的变量。具体而言,分三种作用域,local也就是当前执行的函数内声明的变量;closure,也就是函数声明之处的外层函数声明的变量;global,全局变量。
2.原型链
js的一切都是对象,除了null意外都有构造函数。构造函数拥有一个prototype称作原型对象,既然原型是一个对象,那么原型对象也有原型,也就构成了原型链。一般而言,原型链最终可以追溯到object和function,两者互为原型。当构造函数被实例化以后,当get属性或方法时,会在构造函数的prototype链上去查找。当然,也可以创造出原型干净的对象,因为null没有原型。
3.函数,变量
感觉主要是讲作用域提升。按照es5规范,当打开一个作用域是,也就是执行一个函数时,首先会对形参,arguments进行声明附值;设定this;接下来,把一切函数内的变量和函数声明收集起来,统一提前声明,函数在声明的同时会被定义;接下来就是一行行地执行下去。
4.原型使用
实现原型面向对象编程。当然也可以模拟类。最主要的特点是,原型继承会拥有祖先的状态,也就是说原型上的对象都只有一份。
5.执行上下文
感觉想问的是this?this就是函数的调用者。apply,call相当于切换调用者。直接调用函数相当于是global在调用函数