箭头函数
箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this
,arguments
,super
或new.target
。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。
都说箭头函数不支持 new 运算符。这里实现一个new 运算符来研究下。
function myNew(){
const obj = {
} // 1.创建一个空对象
const con = [].shift.call(arguments)// 2.获取当前的构造函数
if(typeof con !== 'function' || typeof con !== 'Function'){
throw new TypeError('Type Error')
}
obj.__proto__ = con.prototype // 3.链接到构造函数的类型对象
// 4.将新创建的对象obj作为`this`的上下文
const res = con.apply(obj,arguments)
// 5. 如果有返回对象,原有的会被覆 //盖即下面的判断
return res instanceof Object ? res : obj
}
如我们的实现代码来看,实现中有用到 构造函数,而箭头函数没有构造函数,所以..,另外代码中有用到instanceof运算符用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。也就是我们实现new 运算符中 obj.proto = con.prototype ,那我们来也来实现下。
function myInstanceof(left, right){
let prototype = right.prototype
let proto = left.__proto__
// ES5的方法,可以获得对象的原型
// let proto = Object.getPrototypeOf(left);
while(true){
// 沿着原型链遍历
if(proto === null || proto === undefined){
return false
}
if(prototype === proto){
return true
}
proto = proto.__proto__
}
}
new.target
new.target
属性允许你检测函数或构造方法是否是通过new运算符被调用的。在通过new运算符被初始化的函数或构造方法中,new.target
返回一个指向构造方法或函数的引用。在普通的函数调用中,new.target
的值是undefined
。
arguments.callee
callee
是 arguments
对象的一个属性。它可以用于引用该函数的函数体内当前正在执行的函数。这在函数的名称是未知时很有用,例如在没有名称的函数表达式 (也称为“匿名函数”)内
早期版本的 JavaScript不允许使用命名函数表达式,出于这样的原因, 你不能创建一个递归函数表达式;
ECMAScript 3 通过允许命名函数表达式解决这些问题
function foo(){
console.log(arguments)
}
undefined
foo()
1. Arguments [callee: ƒ, Symbol(Symbol.iterator): ƒ]
1. 1. callee: ƒ foo()
1. length: 0
1. Symbol(Symbol.iterator): ƒ values()
1. [[Prototype]]: Object
在严格模式下不支持使用arguments.callee,报TypeError错误。
Function.caller
如果一个函数f
是在全局作用域内被调用的,则f.caller为``null
,相反,如果一个函数是在另外一个函数作用域内被调用的,则f.caller指向调用它的那个函数.
该属性的常用形式arguments.callee.caller
替代了被废弃的 arguments.caller.
Function.caller目前被所有主流浏览器支持: Firefox, Safari, Chrome, Opera 和 IE.
参考:
https://developer.mozilla.org/zh-CN/docs/web/javascript/reference/functions/arguments/callee