Web前端常遇面试题
JavaScript作用域链
执行一段JavaScript时 JS引擎会创建一作用域 又名 执行上下文(Execution Context
) 页面加载时 首先创建一个全局作用域 然后每执行一个函数 会建立一个对应的作用域 ,从而形成作用域链 每个作用域都有一个作用域链 链头是全局作用域 链尾是当前函数作用域。
作用域链的作用时解析标识符 当函数被创建时 会将 this
,arguments
、参数
和函数中的所有变量
添加到当前作用域中,比如当js需要查找一个变量X时 首先会从作用域链的链尾 查找X 如果没有找到 就顺着作用域继续查找 直到查找到链头 还没找到的话 则抛出(Reference
)异常
JavaScript 原型链
对象类型
普通对象
有 __proto__
属性 (指向其原型链)没有prototype
属性
普通对象示例
var o1=new f1();
var o2={};
var o3=new Object();
函数对象
通过new Function()
创建的对象都是函数对象
拥有__proto_
属性和prototype
属性
Function
Object
Array
Date
String
自定义函数
都是函数对象
示例:
function f1(){};
var f2=function(){};
var f3=function("n1","n2","return n1+n2");
以上f1,f2,f3都是属于函数对象
特例:Function.prototype
是函数对象又是原型对象
原型对象
每创建一个函数都会有一个prototype
属性,这个属性就是一个指针 指向一个对象 ,原型对象是包含特定类型的所有示例共享的属性和方法,原型对象的好处是 可以让所有实例对象共享他所包含的属性和方法
object.prototype
原型对象 和 constructor
属性(指向构造函数对象)
之前提到 原型对象属于普通对象 但是 Function.prototype
是个例外 它是原型对象,又是函数对象,作为一个函数对象 它却又没有 prototype
属性
原型对象示例
function myfunction(){};
myfunction.prototype;
其实原型对象就是构造函数的一个示例对象,myfunction.prototype
就是myfunction
的一个示例对象,相当于在myfunction
创建的时候自动实例化了一个对象 并把这个对象赋值给了prototype
属性
以下几个属性都是原型对象
Object.prototype
<pre>
function Cat(){}
Cat.prototype.name=""
</pre>